创建线程后,用循环里MsgWaitForMultipleObjects后,一切运行正常,但是开启一个不相干的第三方程序就死了,弄了很久找不到原因,求大神解答
这个是主线程中的部分代码;
在调试和release版本中单独运行都很正常;
但是我一打开另外一个读取数据的程序就死了;另外的数据读取程序和本程序无关,而且不管这个程序有没有读取到数据,这个程序对应的硬件有没有挂上,都会阻塞我的程序,我的程序数据更新显示都还在,就是鼠标等操作都没有应答了,也关闭不了;这个程序是我买一个设备自带的,不知道为什么会发生这种情况,大神给看一下吧;
hPrsEvents=CreateEvent(NULL,FALSE,FALSE,NULL);
hPrsDEvents=CreateEvent(NULL,FALSE,FALSE,NULL);
hDAQThread=AfxBeginThread(CDaqUsb1616HS::DaqScanT,&m_daq); // 数据采集线程
hPrcThread=AfxBeginThread(CDataPreAnalyse::DaqRundataPrc,&m_dpa); //数据处理线程
hAllEvents[0]=hPrsEvents;
hAllEvents[1]=hPrsDEvents;
while (TRUE)
{
dwRet = MsgWaitForMultipleObjects (2, hAllEvents, FALSE, INFINITE, QS_ALLINPUT); //等待
switch(dwRet)
{
case WAIT_OBJECT_0: //停止
str.Format("数据采集结束!采集次数=%ld,显示存储数量=%ld;",m_daq.daqP.SampleNum,i);
strInfo=str;
break; //break the loop
case WAIT_OBJECT_0+1: // 数据更新
i++;
str.Format("显示数据个数i=%ld,数据处理次数=%d;",i,m_dpa.dataP.iPrsTimes);
strInfo=str;
SetStatusInfo(strInfo,1);
UpdateShow();
continue;
case WAIT_OBJECT_0 + 2:
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE )) //即使是界面被阻塞了,死了,这个消息依然是能进来的
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
continue;
default:
break; // unexpected failure
}
break;
}
在调试和release版本中单独运行都很正常;
但是我一打开另外一个读取数据的程序就死了;另外的数据读取程序和本程序无关,而且不管这个程序有没有读取到数据,这个程序对应的硬件有没有挂上,都会阻塞我的程序,我的程序数据更新显示都还在,就是鼠标等操作都没有应答了,也关闭不了;这个程序是我买一个设备自带的,不知道为什么会发生这种情况,大神给看一下吧;
hPrsEvents=CreateEvent(NULL,FALSE,FALSE,NULL);
hPrsDEvents=CreateEvent(NULL,FALSE,FALSE,NULL);
hDAQThread=AfxBeginThread(CDaqUsb1616HS::DaqScanT,&m_daq); // 数据采集线程
hPrcThread=AfxBeginThread(CDataPreAnalyse::DaqRundataPrc,&m_dpa); //数据处理线程
hAllEvents[0]=hPrsEvents;
hAllEvents[1]=hPrsDEvents;
while (TRUE)
{
dwRet = MsgWaitForMultipleObjects (2, hAllEvents, FALSE, INFINITE, QS_ALLINPUT); //等待
switch(dwRet)
{
case WAIT_OBJECT_0: //停止
str.Format("数据采集结束!采集次数=%ld,显示存储数量=%ld;",m_daq.daqP.SampleNum,i);
strInfo=str;
break; //break the loop
case WAIT_OBJECT_0+1: // 数据更新
i++;
str.Format("显示数据个数i=%ld,数据处理次数=%d;",i,m_dpa.dataP.iPrsTimes);
strInfo=str;
SetStatusInfo(strInfo,1);
UpdateShow();
continue;
case WAIT_OBJECT_0 + 2:
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE )) //即使是界面被阻塞了,死了,这个消息依然是能进来的
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
continue;
default:
break; // unexpected failure
}
break;
}
...全文
相关推荐
MsgWaitForMultipleObjects函数的一种用法
工程是VS2010,具体描述了如何在主线程中用MsgWaitForMultipleObjects等待子线程结束的同时,处理子线程发送的界面消息。
Win32多线程程序设计
侯捷(又名候俊杰)翻译的作品 内容质量有保障 PDF格式带书签 渴望成为多线程高手的同志们不要错过哈~
线程学习资料——平台VC6
经程学习资料VC++6上学习 使用互斥的方法实现同步问题
《Windows多线程编程技术与实例》-郝文化-源代码-3316
Windows多线程编程,里面有各种实例,还具有源代码
c#中实现控制键盘的钩子程序
本程序利用钩子的技术,实现拦截键盘消息。读者只要稍加改动即可实现模拟屏幕软键盘的程序。非常的实用。


进程/线程/DLL
