Như các bạn đã biết, hàm CreateThread cần biết địa chỉ của hàm mà nó sẽ thực thi khi thread chạy(The starting address for a thread) và dĩ nhiên hàm này phải là hàm tỉnh(static function), bạn phải khai báo static nếu là class member hoặc khai báo bên ngoài class như C style.
Ví dụ:
Nhưng nhiều lúc ta lại muốn thực thi 1 hàm non-static bên trong class thay vì chạy thread_proc như bên trên thì làm thế nào? Cách làm thì đơn giản cực kỳ nhưng cách đây khá lâu khi động đến phần này thì mình lại bí.
Cách làm thì có nhiều nhưng do trình độ có hạn nên chỉ dám đóp góp 2 ngu ý như sau:
Cách đầu tiên
Như ta đã biết, hàm CreateThread cho phép ta pass 1 đối số là con trỏ kiểu void(con trỏ mất dạy nhất, nó có thể là bất cứ con trỏ nào). Ta sẽ pass chính con trỏ của thực thể class cần thực thi hàm non-static vào CreateThread và sau đó nhận lại con trỏ này tại đối số của ThreadProc, bước tiếp theo ta chỉ cần gọi hàm non-static cần thực thi từ con trỏ này.Ý tưởng như sau:
Ta có thể cải tiến thêm bằng cách đưa đoạn mã tạo thread vào trong class luôn:
Cách thứ 2
Cách này cao siêu hơn tí, đầu tiên ta sẽ định nghĩa 1 abstract class(đúng hơn là interface nhưng trong C++ nó ko có khái niệm này) chứa 1 public method kiểu pure virtual. Sau đó các lớp nào muốn chạy trong thread thì cần kế thừa từ class này. Chúng ta sẽ tìm hiểu cụ thể ngay bên dưới.Đầu tiên là abstract class đóng vai trò như là 1 interface:
Tiếp theo ta viết 1 class nho nhỏ để tự động tạo thread, bên dưới sử dụng lambda expression cho gọn, ta khỏi phải khai báo thêm static method như cách 1:
Rồi, giờ sử dụng thành quả thôi, cách sử dụng khá giống trong java vì thế mình ko giải thích nhiều:
Cách 2 này cực ở bước chuẩn bị(2 class trên) nhưng sướng ở bước sử dụng vì thế nên tùy vào độ lười của mỗi ng mà lựa chọn style phù hợp :))
0 nhận xét :
Post a Comment