使用WaitforMultipleObjects()函数时线程未执行

Thread Not executing when WaitforMultipleObjects() function is used

本文关键字:线程 执行 函数 WaitforMultipleObjects 使用      更新时间:2023-10-16

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

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);

这必须是一个非成员函数,或者是一个静态成员函数。

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