how to create a thread message queue?(100分)

  • 主题发起人 Another_eYes
  • 开始时间
A

Another_eYes

Unregistered / Unconfirmed
GUEST, unregistred user!
如何为每个thread分配一个独立的message queue?
 
Delphi提供线程类TThread,具体未用过,但目前正在学习它!
 
In the thread to which the message will be posted, call PeekMessage
(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE) to force the system to
create the message queue.
 
在Win32 SDK 的文档中说:
Windows 系统为每个线程自动创建消息队列。如果线程创建了一个
或多个窗口,就必须自己提供从线程消息队列中捡取消息并把它们
发送到相应的窗口过程的消息环,也就是著名的GetMessage, TranslateMessage,
DispatchMessage循环
 
请参看
“ 在线程中如何响应消息?”版
 
hexi, 答非所问. 我问的是如何创建message queue, 不是线程如何处理消息.
您的方法只是替换主进程的wndproc, 消息还是都在主进程的message queue里, 由主进程的
wndproc进行处理的.
我比较同意公子的看法, 不过没时间测试(当初问这个问题纯属好奇, 我的多线程程序中是通过events进行线程和主进程之间的沟通的, 没用消息), 等手头活忙完之后我找个时间测试一下,
如果正确就分分了.
 
Another_eYes:
你好。
如果你要创建消息队列,可将我给的片段程序中的FMessage存入一个消息数组(链表)中,在TMyThread.Execute中可以处理消息,处理一个删除数组中的一个消息,直到所有消息处理完毕。
请参看我更正的程序。
你在测试时,请注意在FOwner.Free前,必须先TMyThread.Free,否则会出现异常,
若无法控制TMyThread.Free,跟FOwner.Free的先后(我曾经遇到过这种问题),你可加入

FOwnerDestroy:TNotifyEvent;
procedure MyDestroy(Sender:TObject);
在构造过程中添加:
FOwnerDestroy:=FOwner.OnDestroy;
FOwner.OnDestroy:=MyDestroy;
在析构过程中:
if Assigned(FOwner) then
FOwner.OnDestroy:=FOwenrDestroy;

procedure MyDestroy;
begin
FillChar(FMessage, Sizeof(FMessage),0);
FEvent.SetEvent;
FThread.Terminate;
if Assigned(FOwner) then
FOwner.OnDestroy:=FOwenrDestroy;

end;
 
多人接受答案了。
 
顶部