使用WaitforMultipleObjects()函数时线程未执行
Thread Not executing when WaitforMultipleObjects() function is used
我正在尝试制作一个测试控制台应用程序,该应用程序使用不同的线程从不同的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
。
相关文章:
- 当我在其中一个线程执行中(在activemq-cpp中)捕获到特定值时,我如何终止/停止所有其他线程
- C++线程:如何在一个线程仍在运行时阻止另一个线程执行 (Win32)
- 在给定时间段内,线程执行的指令数量是否有最小数量?
- 如何在C++中停止线程执行
- 为什么Win API线程执行函数,而标准线程则没有
- 线程执行在IDE中和C 中的EXE应用程序中是否有所不同
- 从线程执行的函数中返回结构数组
- 为什么在从线程执行方法时使用QMetaObject::invokeMethod
- 只有一个线程执行 CUDA 内核
- C++ 多线程:执行顺序
- async_connect()超时,多个线程执行io_service.run()
- 是否可以将线程执行转移到另一个线程?
- 具有随机数总和的多线程执行时间
- 如何 在没有 Boost 的情况下将 C++ 成员函数作为线程执行
- openMP 在自定义容器中从 2 到 4 个线程执行二进制搜索时速度变慢
- 如何使生成的线程拖延足够长的时间以使生成线程执行某些操作
- 远程线程执行
- C++中的基本多线程(执行顺序)
- 线程池中的C++线程执行顺序
- 锁定由不同线程执行的多个函数