c++ - 使用 WaitforMultipleObjects() 函数时线程不执行

标签 c++ windows winapi

我正在尝试制作一个测试控制台应用程序,它使用不同的线程从不同的 COM 端口打开和下载数据。下载数据后,我使用 WaitForMutipleObjects() 等待所有线程完成下载。

WaitForMultipleObjects(nThreadCount,m_threadHandle,true,INFINITE);

但这是行不通的,线程没有被执行就返回了。这是我的线程函数。

void* Test::GetData(void *p)
{
   Test *pThis = (Test *)p;
   string strCOMport;
   int nChannelNo,nBaudRate;
   cout<< " Enter COM port "<<endl;
   cin>>strCOMport;
   cout<< " Enter Channel Number"<<endl;
   cin>>nChannelNo;
   cout<< " Enter Baud Rate "<<endl;
   cin>>nBaudRate;

   if(pThis->InitPort(nChannelNo,0x00,(unsigned char *)strCOMport.c_str(),nBaudRate,0x00) == 0x00)
       cout<< "Init port Success"<<endl;
   else
   {
       cout<< "failed";
       return NULL;
   }
   // download
   ExitThread(0);
}

这些是分别创建和等待线程的函数

void Test::init()
{
  m_threadHandle[nThreadCount] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)GetData,(LPVOID)this,0,&m_dwThreadID[nThreadCount]);
  nThreadCount++;
}

void Test::WaitForThreads()
{
  WaitForMultipleObjects(nThreadCount,m_threadHandle,true,INFINITE);
}

为什么线程函数突然返回了?

最佳答案

您的线程过程有错误的签名。请注意,您使用了强制转换来编译代码。您的代码最初可能是这样说的:

CreateThread(..., GetData, ...);

并且编译器反对 GetData,说它与 LPTHREAD_START_ROUTINE 类型的参数不兼容。不幸的是你选择了错误的解决方案。将其强制转换为 LPTHREAD_START_ROUTINE 实际上并不会使 GetData 成为 LPTHREAD_START_ROUTINE。它只是关闭编译器。

CreateThread(..., (LPTHREAD_START_ROUTINE)GetData, ...);

在这里,GetData 仍然不是 LPTHREAD_START_ROUTINE,但现在编译器无法将您从自己身上拯救出来。

因此,您需要声明 GetData 以获得正确的签名。

DWORD WINAPI GetData(LPVOID lpParameter);

而且this必须是非成员函数,或者静态成员函数。

一旦你解决了所有这些问题,你会发现你不再需要调用 ExitThread()。您可以从线程函数中简单地编写 return 0

关于c++ - 使用 WaitforMultipleObjects() 函数时线程不执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20471589/

相关文章:

c++ - 你能从 `volatile const char*` 构造一个字符串吗? (不使用 `const_cast` )

c++ - 为什么 gdb 在 Windows 中这么慢?

windows - 一个独立的 Delphi 应用程序,也可以作为 Windows 服务安装

c++ - Win32 API 函数与它们的 CRT 对应函数(例如 CopyMemory 与 memcpy)

c - 确定窗口消息的优先级

c++ - 如何有效地杀死 C++ (Win32) 中的进程?

c++ - 混合 C 和 C++ 代码的静态分析怪异符号行为

c++ - 在 VIsual C++ 中使用 C++ 代码,没有错误,但部分代码被忽略

c++ - 捕获隐藏桌面的屏幕截图

windows - 如何在 BITMAP 被 win32 加载后编辑它