在程序的主界面上打开一个模态对话框窗口做一些操作。同时,另一个工作线程通过PostMessage向主窗口发送消息,主窗口收到消息后,把字符串显示到一个ListBox中。
按我的理解,如果UI是主线程的一部分,当我打开一个模态对话框做一些操作的时候,这时候主线程应该是阻塞在这个对话框上的,工作线程发来的消息,主窗口是无法处理的。但实际情况是,当我在对话框上做一些操作的时候,主窗口也在很顺畅的处理来自工作线程的消息,并把字符串显示到了ListBox中。 或者UI并不是主线程的一部分?
对于UI和主线程或者其他工作线程的关系已经困惑了我很久了,请高人解惑。
按我的理解,如果UI是主线程的一部分,当我打开一个模态对话框做一些操作的时候,这时候主线程应该是阻塞在这个对话框上的,工作线程发来的消息,主窗口是无法处理的。但实际情况是,当我在对话框上做一些操作的时候,主窗口也在很顺畅的处理来自工作线程的消息,并把字符串显示到了ListBox中。 或者UI并不是主线程的一部分?
对于UI和主线程或者其他工作线程的关系已经困惑了我很久了,请高人解惑。
模态对话框内部的消息循环虽然会处理发给本线程的所有消息,但由于主线程阻塞在了调用这个模态对话框的某个函数的某行,应该说,主界面是不会被刷新的。我让一个工作线程建立消息循环,其他线程向它发送消息,它收到一条消息开始执行一个函数时,对下一条消息就不会做出反应,直到之前的函数执行完,才会处理其他消息。但带有UI的主线程好像不是这样的,感觉UI好像和主线程是两个并行的线程一样。在模态对话框上进行操作的时候,主界面窗口依然可以刷新。
刷新靠的是WM_PAINT消息,明白了吧?
1、收到消息WM_TEST,窗口过程调用OnTest
2、OnTest中启动模式对话框
3、模式对话框启动内部消息循环接收消息
4、内部消息循环再次收到一个WM_TEST消息,窗口过程被调用
5、窗口过程中调用OnTest,这个调用就是OnTest的间接嵌套,也就是函数重入,此时第一次的OnTest并没有返回,但线程没有被阻塞。
过了一段时间来看这个,感觉明白了不少。
对MFC这套体系看来还是理解的太有限,需要看看MFC的代码了。