关于win32程序如何使用mfcdll的问题.

对于一个mfcdll, 被win32使用的时候, 会出现麻烦.

在debug模式下, win32程序断言失败.
在release模式下, 由于没有使用断言, 正常运作.


另外, 一个工作线程, 如果其调用了PeekMessage() 那么其就变成了 UI线程!!!
只不过, 由于这个工作线程的消息队列里面没有任何消息!!!
如果这个工作线程创建了窗口, 那么其消息队列里面自然就有了windows给这个窗口投递的消息.

记住下面的定理:
1: 当且仅当 一个线程里面调用了PeekMessage/GetMessage, DispatchMessage()等几个消息分配函数, 一个线程才是用户界面线程. 但是默认线程的消息队列里面是没有消息的.

2:  当线程内部创建了一个窗口之后, 或者, 别的线程往这个线程投递了消息了, 线程的消息队列里面才有消息可取.

/////////////
解惑1:
不难理解为何, TXDATA()由工作线程摇身一变, 变成了UI线程. 这是因为,
1:cvNameWindow()内部创建了窗口,
2:cvWaitKey()内部调用了消息分派.
导致这个工作线程拥有了消息循环, 也拥有了消息.

解惑2:
当向一个仅有消息分派没有窗口的线程投递消息时, 这个消息由那个窗口的消息处理函数处理???
答案是: 不由哪个窗口的处理函数处理, 而是在GetMessage时, 就可以处理, 也就是, 在线程里面直接处理, 当然, 你仍然可以把该窗口句柄为NULL的消息进一步 Dispatch, 然后, 如果该线程有窗口, 所有的窗口的窗口处理函数还想都能够处理该消息. 呼呼

解惑3:
SendMessage(HWND), 的第一个参数是窗口句柄, 那么消息怎么进入线程的消息队列里了呢?
windows内部会检查, 这个hwnd这个窗口是有谁创建的, 然后把消息放入对应线程的消息队列里.
假如SendMessage的消息发送方, 和消息接收方, 属于不同的两个线程, 那么由于SendMessage是同步的, windows会进行线程的上下文切换, 也就是, 发送方的线程将失去CPU资源, 直到消息被处理返回.

为了防止接收方线程挂掉, 导致发送方线程也跟着挂掉, windows提供了 SendMessageTimeout()API, 可以指定等待的时间.

你可能感兴趣的:(windows,工作,UI,api,null)