窗口消息循环,线程消息循环,区别???

okmnji79513 2010-01-07 11:32:37
有如下情况:在主线程中创建一个子线程,主线程 通过 发送消息 来通知子线程,我见过有两种方式:
1、子线程中

procedure TThread.WndProc(var Message: TMessage);
begin
DefWindowProc(FWnd, Message.Msg, Message.WParam, Message.LParam);
end;

procedure TThread.Execute;
begin
{$IFDEF DELPHI_6_UP}
FWnd := Classes.AllocateHWnd(WndProc);
{$ELSE}
FWnd := AllocateHWnd(WndProc);
{$ENDIF}
try
while not Terminated do
begin
try
GetMessage(Msg, FWnd, 0, 0);

if //想要自己处理的消息
begin
//相关操作
end
else if not Terminated then
DispatchMessage(Msg);
except
end;
end;
finally
{$IFDEF DELPHI_6_UP}
Classes.DeallocateHWnd(FWnd);
{$ELSE}
DeallocateHWnd(FWnd);
{$ENDIF}
end;
end;

主线程: 用 PostMessgae 通知子线程

2、子线程中:

procedure TThread.Execute;
begin
while not Terminated do
begin
try
GetMessage(Msg, 0, 0, 0);

//根据 不同情况 ,做不同事情

except
end;
end;
end;

主线程:用PostThreadMessage通知子线程


上面两种方式,那种比较好?比较合理,高效,健壮?或有更好的方式?
...全文
353 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
kfcoffe 2010-01-07
  • 打赏
  • 举报
回复
学习了
cnzdgs 2010-01-07
  • 打赏
  • 举报
回复
帖子标题应改为PostMessage与PostThreadMessage的区别。消息队列是属于线程的,Post消息就是把消息放到目标线程的消息队列中。这两者的区别在于,PostMessage通过指定目标窗口句柄来确定目标线程,通常情况下由窗口过程来处理消息;PostThreadMessage直接指定线程ID来确定目标线程,没有目标窗口,只能在消息循环中直接根据消息类型做相应的处理。在程序设计的选择方面,如果是UI线程,则应使用PostMessage;如果是工作线程,则应使用PostThreadMessage,不要为了接收消息而创建窗口。
hjkto 2010-01-07
  • 打赏
  • 举报
回复
进来学习学习
lhy 2010-01-07
  • 打赏
  • 举报
回复
前一种是显式的建立线程消息队列,后一种是隐式的建立线程消息队列。
bdmh 2010-01-07
  • 打赏
  • 举报
回复
何不合理,没有严格的界定,用好就行
kfcoffe 2010-01-07
  • 打赏
  • 举报
回复
呵呵,楼上回答的好感性、
dd_zhouqian 2010-01-07
  • 打赏
  • 举报
回复
看题说话
窗口的消息循环 ,都是在主线程中。

线程消息循环,当然在子线程中。
okmnji79513 2010-01-07
  • 打赏
  • 举报
回复
OK 谢谢 结了

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧