Cá nhân, tôi sẽ không xem xét thông qua trong một con trỏ hàm như bạn đang cố gắng để làm như rất C + + như thế nào. Đó là mã C trong C++
Thay vào đó, tôi muốn bọc thứ đó vào một lớp. Ưu điểm lớn đó là bạn chỉ có thể ghi đè lên lớp để có tuy nhiên nhiều thành viên mà bạn muốn, thay vì phải thực hiện thủ thuật đúc greazy để có được các thông số của bạn mỗi lần.
Mã này hơi dài, vì vậy tôi đã đẩy nó đến cuối. Nhưng những gì nó cho phép bạn làm là một cái gì đó như thế này:
class print_some : public basic_thread {
private:
int i;
public:
print_some (int i) : i(i) {};
action_callback() {
std::cout << i << std::endl;
}
}
int main() {
print_some printer (155);
}
Dưới đây là một số ví dụ mã exerpted từ một trong các lớp học của chúng tôi thực hiện điều này:
class basic_thread :
{
public:
basic_thread();
protected:
unsigned long m_ThreadId;
virtual void action_callback() {};
// Internal routine used to bridge between OS callback format and
// action_callback. *Must* be static for the OS.
static unsigned long __stdcall self_calling_callback (void *parameter);
}
... và trong cpp:
unsigned long __stdcall basic_thread::self_calling_callback (void *parameter) {
if (parameter) {
basic_thread * thread = reinterpret_cast<basic_thread *>(parameter);
thread->action_callback();
}
return 0; // The value returned only matters if someone starts calling GetExitCodeThread
// to retrieve it.
}
basic_thread::basic_thread() {
// Start thread.
m_Handle = CreateThread(NULL,
0,
self_calling_callback,
(PVOID)this,
0,
&m_ThreadId);
if(!IsHandleValid())
throw StartException("CreateThread() failed", GetLastError());
}
Nguồn
2008-12-31 14:55:47
Vậy vấn đề chính xác là gì? – Brian