[原]线程消息拾遗

PostThreadMessage函数是给线程发送线程消息用的,所以接受消息的线程首先要建立一个消息队列才能接受该线程消息。用PeekMessage函数就能强制系统建立起一个消息队列。建立方法如下:
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
但是,会出现下面这种情况:如果发送线程消息的时候,接受线程的消息队列没有启动的时候,消息就会丢失,这种情况怎么办呢?

在启动消息线程的时候启动一个设置一个event object就可以了,等消息线程的消息队列准备好后signal一下这个event,等待线程就可以发送消息了。这样避免了消息丢失。

PostThreadMessage函数发送的消息是不与窗口相对应的,按照一般规则,如果不与窗口帮定的消息Dispatch函数是不进行消息派发的。因此,如果接受线程是一个窗口消息队列,那么该消息将会丢失。所以,这种情况就要单独使用一个线程来进行接受了,然后给那个窗口消息队列发送窗口消息。

系统的消息号WM_USER消息以前定义的消息,所以用户自定义消息需要用“WM_USER + 整数”表示。不过建议还是使用RegisterWindowMessage函数来注册一个Windows消息,该函数的返回值就是这个消息的标号,这个可以保证不会跟现有消息重复。

需要注意的是,Windows NT下的消息队列最大允许放10000个消息,这其实足够了,所以如果你的程序发送的消息导致消息队列超出了最大值,你就应该考虑你的程序是否需要重新设计了(其实,大都不用考虑,应该需要重新设计)。也可以通过修改注册表的默认值来更改消息队列存储最大数:
HKEY_LOCAL_MACHINE\SOFTWARE \Microsoft \Windows NT \CurrentVersion \Windows
下的USERPostMessageLimit值,最小默认值为4000;

你可能感兴趣的:(windows,Microsoft)