最近在忙活进程通讯的东西,其中在A进程中有个通讯线程ATHREAD,B进程中有通讯线程Bthread,研究了半天这个THREAD该怎么写,研究结果如下。
1、线程中创建一个窗口。这个窗口的消息循环需要在线程中,
2、处理线程的消息循环代码如下
while (PeekMessage(message,0,0,0,PM_REMOVE)) do //这里如果没有消息就继续
begin
TransleteMessage(Message);
DispatchMessage(Message);
end
//这里就是我么说的ONIDLE事件的处理流程。
WaitMessage;
在上边的代码中我思索了半天查了很多资料了解如下,这里我们如何选择是 使用PEEKMESSAGE,还是使用GETMESSAGE函数。
总结如下,如果你在线程中希望在没有消息的条件下可以去执行其他东西那么我们建议使用PEEKMESSAGE,如果你的处理很单一,就是使用线程循环去处理消息那么我们可以使用GETmessage,因为GETMESSAGE是阻塞式的。
而PEEKMESSAGE是非阻塞式的。
那么上边的代码我们可以修改成
while not terminated do
begin
while getMessage(msg,hwnd,0,0) do //这里如果没有消息就阻塞了。
begin
TransleteMessage(Message);
DispatchMessage(Message);
end;
end;
接着我们总结下:
GetMessage 与 PeekMessage函数的对比
GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax)
PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax,UINT wRemoveMsg)
根据参数可以看出以上2个函数的区别,参数wRemoveMsg的作用是指定消息获取的方式,如果设为PM_NOREMOVE,那么消息将不会从消息队列中被移出,如果设为PM_REMOVE,那么消息将会从消息队列中被移出;
还有区别:
他们如果没有捕获到消息,程序的主线程会被操作系统挂起。当操作系统再次回来照顾此线程时,发现消息队列中仍然没有消息可取,此时两个函数的行为就不同了:
GetMessage : 过门不入,操作系统再次挂起此线程,去照顾别的线程;
PeekMessage: 取回控制权,使程序执行一段时间,等待可能的消息进入消息队列并将其捕获;这时程序进入空闲时间阶段;