把Delphi里TThread的WaitFor函数转化成C++代码,就会是下面这个样子。
-
BOOLTThread::WaitFor(HANDLEhThread)
- {
- MSGmsg;
-
HANDLEhandle[1];
- handle[0]=hThread;
-
DWORDdwWaitResult=0;
-
do
- {
-
-
-
if(dwWaitResult==WAIT_OBJECT_0+1)
- PeekMessage(&msg,0,0,0,PM_NOREMOVE);
-
dwWaitResult=MsgWaitForMultipleObjects(1,handle,false,1000,QS_SENDMESSAGE);
-
if(dwWaitResult==WAIT_FAILED)
-
returnFALSE;
-
if(dwWaitResult==WAIT_TIMEOUT)
- {
- TerminateThread(hThread,0);
-
returnFALSE;
- }
- }
-
while(dwWaitResult!=WAIT_OBJECT_0);
-
returnTRUE;
- }
使我疑惑的是这两行代码
-
if(dwWaitResult==WAIT_OBJECT_0+1)
- PeekMessage(&msg,0,0,0,PM_NOREMOVE);
如果注释所讲是真的,那究竟在哪里处理了其它线程用SendMessage发送过来的消息呢?于是我翻MSDN,查PeekMessage函数,它有这样的解释:
“The PeekMessage function dispatches incoming sent messages, checks the thread message queue for a posted message, and retrieves the message (if any exist).”
我用的是MSND2005,好像再早些的版本里并无“dispatches incoming sent messages”这句。光看这样的注释,实在是太晦涩了些。想起我原来好像发过个讨论这问题的帖子,翻了下发帖记录,还真有,见http://topic.csdn.net/u/20070824/14/d0c96e50-6348-49d3-98e4-9fcc9ead5fdd.html。我当时找到的答案是这样的:
“找到答案了。答案在<<Programming Applications for Microsoft Windows>>第26章的Waking a Thread一节.
The Algorithm for Extracting Messages from a Thread 's Queue
...
1. If the QS_SENDMESSAGE flag is turned on, the system sends the message to the proper window procedure. Both the GetMessage and PeekMessage functions handle this processing internally and do not return to the thread after the window procedure has processed the message; instead, these functions sit and wait for another message to process.
我试着翻译一下:如果QS_SENDMESSAGE标志位有效,系统发送消息(即其它线程通过SendMessage发送过来的消息)到对应的窗口过程。GetMessage和PeekMessage函数在内部进行这样的处理,一直等到窗口过程处理完之后才会返回。也就是说,这些函数(GetMessage和PeekMessage)坐下来等到其它的消息处理完。”
书本里的解释已经很清楚详细了,我当时的译文有错误,原文是说GetMessage和PeekMessage调用窗口过程处理完SendMessage发送过来的消息后,还会继续坐下来等自己消息队列里的消息。
理论有了,结合着看看上面WaitFor的代码。MsgWaitForMultipleObjects的最后一个参数QS_SENDMESSAGE指明了如果其它有其它线程用SendMessage向本线程的窗口发送消息,MsgWaitForMultipleObjects就会立即返回,返回值为WAIT_OBJECT_0 + nCount(本例中nCount值为1),接下来就轮到PeekMessage登场了。
PeekMessage其实做了两件事,一件是把收到的消息标示为旧消息。见MSND里对MsgWaitForMultipleObjects返回值的解释:
“Functions such as PeekMessage, GetMessage, and WaitMessage mark messages in the queue as old messages.”
另一件就是把SendMessage发送过来的消息dispatch到窗口过程。下一次调用MsgWaitForMultipleObjects时队列里便没有新消息了。
那变旧的消息还在队列里吗?答案是不在。因为用SendMessage发送过来的消息根本就不会进应用程序的消息队列。在PeekMessage调用窗口过程处理完它时,它便消失了。而我们也很轻松的就知道,SendMessage函数把QS_SENDMESSAGE这个标志turn on了,PeekMessage和GetMessage还有WaitMessage把这个标志turn off了,把QS_SENDMESSAGE标志turn off的过程就是把消息变旧的过程。
分享到:
相关推荐
关于FindWindow PostMessage SendMessage PeekMessage 的两个例子
C++(API介绍) 1: PeekMessage 该函数为一个消息检查线程消息队列,并将该消息(如果存在)放于指定的结构。
钩子函数实际上是一个处理消息的程序段,每当一个应用程序调用函数GetMessage或PeekMessage而恰有一个消息即将被处理时,系统调用钩子函数。也就是说,当特定的息发出,在没有到达目的窗口前,钩子函数先捕获消息,亦...
介绍了VC关于串口通信编程的基本概念,并分别介绍了基于MSCOM与Win32 API函数的串口通信编程,再附上一个多线程串口通信实例。
那么有什么办法可以解决吗? 虽然我们在制作模态窗口中的页面时,可以使用普通的IE窗口来访问其内容和调试脚本。可是当我的页面完成,并装载入模态窗口并依赖一系列的输入数据后,我们要对他进行debug,就变得很不...
36.PeekMessage和GetMessage的主要区别 37.WIN32创建窗口程序基本函数 38.Windows中的系统消息循环占用CPU的疑问 39.队列消息与非队列消息 40.GDI对象绘图步骤 41.设备上下文DC 42.GDI位图绘制步骤 43.当模态...
windowsmainno getmessage modify the peekmessage
记录键盘操作。键盘钩子记录键盘鼠标操作,监控和设定查证。
取QQ号码,等待延时,是否存在,PeekMessage
易语言批量提取QQ在线用户源码,取QQ号码,等待延时,是否存在,PeekMessage
运用多线程(MFC工作组线程)绘制两个线程,分别为姐姐弟弟,弟弟做作业期间姐姐可以随时打断(或两者同时运行)以便询问题目,其中还加了gif动态贴图,已经peekmessage消息机制。
易语言处理事件源码,处理事件,处理事件_,PeekMessage,DispatchMessage,TranslateMessage,GetInputState
WH_HARDWARE 线程、系统 每当调用GetMessage或PeekMessage函数时,如果从消息队列中得到的是非鼠标和键盘消息,则调用钩子函数 WH_JOURNALRECORD 系统 日志记录钩子,用来记录发送给系统消息队列的所有消息 WH_...
// Function : XSleep() // Purpose : To make the application sleep for the specified time // duration. // Duration the entire time duration XSleep sleeps, it // keeps processing the message pump, to ...
随机矩形生成器。可用来查看peekmessage与getmessage的区别
win32appdllpeekmessage0.1 is a windows 32 PeekMessage app dll.
PostThreadMessage、_beginthreadex和PeekMessage使用示例,以及WaitForSingleObject事件机制示例。
批量提取QQ在线用户 系统结构:取QQ号码,等待延时,是否存在,PeekMessage
易语言处理事件模块源码,处理事件模块,斩月_处理事件,PeekMessage,DispatchMessage,TranslateMessage,GetInputState
这样做, 最好授予用户可视提示有关可用窗口大小。 通过示例 RESIZE 示例代码显示如何修改 Windows 窗口以便当用户使用鼠标来调整窗口边框跳转到下一个可用大小自动调整方式。 更多信息 可用于从 Microsoft ...