这个是主线程中的部分代码;
主线程中需要创建非模态对话框,当鼠标按住对话框标题栏移动时,下面的等待循环while(TRUE)就卡在下面的DispatchMessage(&msg); 函数上了,因为DispatchMessage函数要等待消息处理函数返回;因为是主线程要求响应消息,有界面控件输入,所以必须要响应消息。有没有什么函数可以替代DispatchMessage函数,可以不需要等待返回?用PostMessage发送消息行不通。
当主线程界面的CListCtrl控件有滚动条时,鼠标点住滚动条时同样是会堵塞,应该都是DispatchMessage函数等待返回。
大神们,有没有什么解决方案既可以让主界面正常响应消息,又不会堵塞While循环,不遗漏同步事件的啊????????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:
while (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg); ////当鼠标按住对话框标题栏移动时
}
continue;
default:
break; // unexpected failure
}
break;
}
主线程中需要创建非模态对话框,当鼠标按住对话框标题栏移动时,下面的等待循环while(TRUE)就卡在下面的DispatchMessage(&msg); 函数上了,因为DispatchMessage函数要等待消息处理函数返回;因为是主线程要求响应消息,有界面控件输入,所以必须要响应消息。有没有什么函数可以替代DispatchMessage函数,可以不需要等待返回?用PostMessage发送消息行不通。
当主线程界面的CListCtrl控件有滚动条时,鼠标点住滚动条时同样是会堵塞,应该都是DispatchMessage函数等待返回。
大神们,有没有什么解决方案既可以让主界面正常响应消息,又不会堵塞While循环,不遗漏同步事件的啊????????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:
while (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg); ////当鼠标按住对话框标题栏移动时
}
continue;
default:
break; // unexpected failure
}
break;
}
本身也是同步的,一样会阻塞的啊!我试了一下,结果也是一样的
while (PeekMessage(& 修改为 if(PeekMessage(& 试试看 还会有其他问题的,消息一次取一个,很容易死掉,以前我是用if的,用while一次把所有消息都取完是最好的,不然效率太低!!
问题是在dispatchmessage上,他是同步函数,所以要等待消息处理完之后返回;因为拖动标题栏要等待鼠标放掉,一个拖动动作才算完成,我用拦截鼠标拖动标题栏的消息,自己实现拖动窗口的功能克服了这个问题;我想用同样的办法消除,鼠标点击最小,最大化按钮不放,和鼠标点住CListCtrl里面的滚动条不放导致界面不能更新的问题,发现我无法判断鼠标具体点击滚动条的什么部位,如是滚动条的左右两边的箭头,滚动条滑块还是滚动条空白处;没有函数和参数可以得到这个信息;因为CListCtrl里面的滚动条不是CScrollBar对象,是自绘的滚动条,所以GetScrollBarCtrl函数得到的是空指针;我也知不道怎么样得到鼠标是点击了最小化最大化按钮;请问大神有办法解决吗?
我已经把书从第一页看完第九章了:用内核进行线程同步了,还是没有找到解决方法;
难道我看岔了吗?没发现解决方法
我已经把书从第一页看完第九章了:用内核进行线程同步了,还是没有找到解决方法;
难道我看岔了吗?没发现解决方法
那就换《深入浅出MFC》
我已经把书从第一页看完第九章了:用内核进行线程同步了,还是没有找到解决方法;
难道我看岔了吗?没发现解决方法
那就换《深入浅出MFC》这本书我看过的,没有这方面的内容,我准备自己去实现CListCtrl里的滚动条功能;