在程序的主界面上打开一个模态对话框窗口做一些操作。同时,另一个工作线程通过PostMessage向主窗口发送消息,主窗口收到消息后,把字符串显示到一个ListBox中。
按我的理解,如果UI是主线程的一部分,当我打开一个模态对话框做一些操作的时候,这时候主线程应该是阻塞在这个对话框上的,工作线程发来的消息,主窗口是无法处理的。但实际情况是,当我在对话框上做一些操作的时候,主窗口也在很顺畅的处理来自工作线程的消息,并把字符串显示到了ListBox中。 或者UI并不是主线程的一部分?
对于UI和主线程或者其他工作线程的关系已经困惑了我很久了,请高人解惑。
按我的理解,如果UI是主线程的一部分,当我打开一个模态对话框做一些操作的时候,这时候主线程应该是阻塞在这个对话框上的,工作线程发来的消息,主窗口是无法处理的。但实际情况是,当我在对话框上做一些操作的时候,主窗口也在很顺畅的处理来自工作线程的消息,并把字符串显示到了ListBox中。 或者UI并不是主线程的一部分?
对于UI和主线程或者其他工作线程的关系已经困惑了我很久了,请高人解惑。
解决方案 »
- WaitForMultipleObjects的奇怪问题
- 请问ADO绑定类的各字段如何可以绑定到对话框界面上?
- 请问std::vector<ConnSocket>vecConnSocket;是什么意思?
- 请教:当不知道两个变量的类型的时候(可能是string, int, double)时,怎么比其大小
- 给SHGetFileInfo函数传递参数
- 求教:一个关于读写文件的问题!
- 如何用VC在NT下做一个用户管理程序
- 如何从Internet上有效而稳定地下载文件详解
- 巨难问题:高手请进!!
- 天同证券招vc程序员,本周二、周三为面试时间。
- rename("EOF","adoEOF") 的位置问题
- 在VC中怎样调用VB的dll
模态对话框内部的消息循环虽然会处理发给本线程的所有消息,但由于主线程阻塞在了调用这个模态对话框的某个函数的某行,应该说,主界面是不会被刷新的。我让一个工作线程建立消息循环,其他线程向它发送消息,它收到一条消息开始执行一个函数时,对下一条消息就不会做出反应,直到之前的函数执行完,才会处理其他消息。但带有UI的主线程好像不是这样的,感觉UI好像和主线程是两个并行的线程一样。在模态对话框上进行操作的时候,主界面窗口依然可以刷新。
刷新靠的是WM_PAINT消息,明白了吧?
1、收到消息WM_TEST,窗口过程调用OnTest
2、OnTest中启动模式对话框
3、模式对话框启动内部消息循环接收消息
4、内部消息循环再次收到一个WM_TEST消息,窗口过程被调用
5、窗口过程中调用OnTest,这个调用就是OnTest的间接嵌套,也就是函数重入,此时第一次的OnTest并没有返回,但线程没有被阻塞。
过了一段时间来看这个,感觉明白了不少。
对MFC这套体系看来还是理解的太有限,需要看看MFC的代码了。