我想将一个类的对象作为参数传递给 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/

10-13 07:57