网站无法备案,wordpress个人博客毕业设计,上饶网站建设兼职,上海建设摩托官方网站AfxMessageBox为什么不阻塞消息响应函数我写了一个MFC程序#xff0c;有个GUI主线程和另外一个次线程#xff0c;次线程会不停向GUI线程发送我自己定义的消息。我在消息处理函数中用了AfxMessageBox。如下#xff1a;LRESULT CMainFrame::OnReceiveUserMessage(WPARAM w, LP…AfxMessageBox为什么不阻塞消息响应函数我写了一个MFC程序有个GUI主线程和另外一个次线程次线程会不停向GUI线程发送我自己定义的消息。我在消息处理函数中用了AfxMessageBox。如下LRESULT CMainFrame::OnReceiveUserMessage(WPARAM w, LPARAM l){ ......//代码部分1 AfxMessageBox(_T(...)); ......//代码部分2}由于次线程会不停地向GUI线程发送此消息。所以GUI线程会调用消息响应函数。但让我感到困惑的是我的第一次响应函数执行时AfxMessageBox的消息框弹出来我没有关闭它意味着此消息响应函数还没有执行完代码部分2并没有被执行。但GUI线程的消息响应并没有停止它在收到此线程的消息后会陆续地进行第2次消息响应第3次消息响应等等很多个消息框都会陆续地弹出来。我的理解是消息响应函数是在GUI线程中执行的如果一次的消息响应没有完成GUI线程应该等待它的返回而不能进行消息响应但这里为什么可以呢另外一个问题如果将AfxMessageBox(_T(...));换成一段计算代码。比如for (int i0; i10000000;i){ int k 0; k;}这段代码执行的时间足够长次线程在这段时间又往主线程发送了若干消息主线程能否在这段代码执行的时候响应后面的次线程发送来的消息应该是不能吧?我个人觉得这是AfxMessageBox这个函数的问题它也许和一般的计算代码不一样。希望和大家讨论一下再思考一下将AfxMessageBox换成一个模态对话框又会怎么样呢比如CUserDefineDlg dlg;dlg.Domodal();1.AfxMessageBox自己有一个消息循环也就是说OnReceiveUserMessage是可以被重入的。如果你要挂起线程你可以用WaitForSingleObject但是不建议这么做。1.那只能说明AfxMessageBox是阻塞了,只是OnReceiveUserMessage 这个地方的处理可能并不是UI线程处理的MFC里面UI线程有派生其他线程去处理其他事情的功能,很多控件都可以,像进度条,之所以能够连续的显示进度的变化,是因为主界面没有重绘的情况下在收到WM_PAINT的时候产生另外的线程去更新进度条部分做重绘而已.1.AfxMessageBox自己有一个消息循环,模态对话框也一样。如果他们接收到不属于自己的消息如父窗口的消息就会转发给父应该调用父的WindowProc处理该消息。如果使用模态对话框替换掉AfxMessageBox会出现同样的情况。1.AfxMessageBox和耗时的计算是有区别的AfxMessageBox等待用户输入的同时在处理GUI消息耗时的计算是没有的。1.消息响应函数是可以重入的这个要注意。另外你在工作线程中肯定用的是SendMessageSendMessage对消息的处理跟其它的队列消息有些不同它的优先级比较高只要主线程处于空闲状态Send过来的消息会被优先处理就像直接调用消息响应函数一样。1.你这个LRESULT CMainFrame::OnReceiveUserMessage(WPARAM w,LPARAM l)是否重新实现过?AfxMessageBox 如果不能阻塞基本上就一个原因拉,就是他自己的消息循环并没有阻塞,虽然已经show出来的但没成功进入阻塞.导致这个原因很可能是你的消息处理循环是你自己另外实现过了,而且没有放到主线程内你是否用的是一个不带消息循环的线程去做这个过程,而且AfxMessageBox的父消息循环继承自这个没消息队列的线程?导致了GetMessage()这个涵数永远都能不断返回,阻塞不了1.从你上面的描述来看AfxMessageBox和模态对话框是肯定不能阻塞所有消息响应的特别是自定义消息。另外如果是多线程环境AfxMessageBox和模态对话框后面的代码可能在它们没有被关闭也就是返回的情况下执行。这个想来有点怕怕总之一句话用AfxMessageBox和模态对话框多加小心就是了。1.也许这个对你有帮助在google上搜索“深入探讨MFC消息循环和消息泵”1.“还有一事也让我晕菜 我在调试这个程序的过程中在GUI线程的消息响应函数中加了一个断点当程序运行到断点时次线程也不运行了。我没有在GUI线程和次线程之间设置任何同步互斥次线程只负责将消息投递到GUI线程中。为什么GUI线程的断点会让次线程也不运行呢按理说次线程还是应该继续向GUI线程投递消息但它就是不工作。