我想将一个类的对象作为参数传递给 CreateThread
函数。
在 main
中以这种方式创建对象:
Connection *connection = new Bluetooth();
Brick *nxt = new Brick(connection);
我传递给
CreateThread
的函数是:DWORD WINAPI recieveFunct(Brick nxt)
最后,在
CreateThread
中调用 main
:IDRecieveThread = CreateThread(NULL, 0, recieveFunct, *nxt, 0, NULL);
在
main
中,我创建了 nxt
对象。该对象具有我想从线程调用的读取和写入函数。但是,我无法让它工作。我是否需要将对象转换为
HANDLE
?还是我看起来完全错了?感谢您的反馈家伙!
我已经实现了上面给出的解决方案:
int main()
{
HANDLE IDRecieveThread = 0;
//set up the NXT
Connection *connection = new Bluetooth(); Brick *nxt = new Brick(connection);
//Setup connection
cout << "connecting..." << endl;
connection->connect(3);
cout << "connected" << endl;
cout << "Starting recieve thread...." << endl;
IDRecieveThread = CreateThread(NULL, 0, recieveFunct, reinterpret_cast<void*>(nxt), 0, NULL);
cout << "Recieve thread started" << endl;
}
但是编译器给出了这个错误:
C:\Documents and Settings\Eigenaar\Bureaublad\BluetoothTestr\test\main.cpp||In function `int main()':|
C:\Documents and Settings\Eigenaar\Bureaublad\BluetoothTestr\test\main.cpp|39|error: invalid conversion from `void (*)(void*)' to `DWORD (*)(void*)'|
C:\Documents and Settings\Eigenaar\Bureaublad\BluetoothTestr\test\main.cpp|39|error: initializing argument 3 of `void* CreateThread(_SECURITY_ATTRIBUTES*, DWORD, DWORD (*)(void*), void*, DWORD, DWORD*)'|
C:\Documents and Settings\Eigenaar\Bureaublad\BluetoothTestr\test\recievethread.h|4|warning: 'void recieveFunct(void*)' declared `static' but never defined|
||=== Build finished: 2 errors, 1 warnings ===|
有人可以告诉我出了什么问题吗?调用
CreateThread
函数时出现错误。 最佳答案
您需要将 nxt
转换为 LPVOID
,而不是 HANDLE
。 MSDN 说“LPVOID lpParameter
[in, optional] - 指向要传递给线程的变量的指针。”这种将数据传递给回调函数或线程的设计模式通常称为“用户数据”指针。
http://msdn.microsoft.com/en-us/library/ms682453%28v=vs.85%29.aspx
当您调用 LPVOID
并在您的 CreateThread()
线程函数中取消转换时,您可以将 Brick 指针转换为 recieveFunct
(即指向 void 的指针):
static void recieveFunct(void* pvBrick)
{
Brick* brick = reinterpret_cast<Brick*>(pvBrick);
}
Connection *connection = new Bluetooth(); Brick *nxt = new Brick(connection);
IDRecieveThread = CreateThread(NULL, 0, recieveFunct, reinterpret_cast<void*>(nxt), 0, NULL);
此外,如果您使用 MSVCRT 库,您可以考虑使用
beginthreadex()
而不是 CreateThread()
。 beginthreadex()
将确保为您的线程正确初始化 MSVCRT。关于c++ - 如何将对象传递给 CreateThread 函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6604372/