目标是在两个线程之间创建通讯,其中一个线程是主线程。我正在寻找的是创建一个窗口,它需要更少的资源,并且只用于接收信息。
你能给我提供一些参考吗?
目标是在两个线程之间创建通讯,其中一个线程是主线程。我正在寻找的是创建一个窗口,它需要更少的资源,并且只用于接收信息。
你能给我提供一些参考吗?
procedure TMyThread.Execute;
begin
// this sets up the thread message loop
PeekMessage(LMessage, 0, WM_USER, WM_USER, PM_NOREMOVE);
// your main loop
while not terminated do
begin
// look for messages in the threads message queue and process them in turn.
// You can use GetMessage here instead and it will block waiting for messages
// which is good if you don't have anything else to do in your thread.
while PeekMessage(LMessage, 0, WM_USER, $7FFF, PM_REMOVE) do
begin
case LMessage.Msg of
//process the messages
end;
end;
// do other things. There would probably be a wait of some
// kind in here. I'm just putting a Sleep call for brevity
Sleep(500);
end;
end;
要向您的线程发送消息,请执行以下操作:
PostThreadMessage(MyThread.Handle, WM_USER, 0, 0);
在主线程方面,使用Classes单元中的AllocateHWnd方法设置窗口句柄,并传递一个WndProc方法。AllocateHWnd非常轻量级且易于使用:
TMyMessageReciever = class
private
FHandle: integer;
procedure WndProc(var Msg: TMessage);
public
constructor Create;
drestructor Destroy; override;
property Handle: integer read FHandle;
end;
implementation
constructor TMyMessageReciever.Create;
begin
inherited Create;
FHandle := Classes.AllocateHWnd(WndProc);
end;
destructor TMyMessageReciever.Destroy;
begin
DeallocateHWnd(FHandle);
inherited Destroy;
end;
procedure TMyMessageReciever.WndProc(var Msg: TMessage);
begin
case Msg.Msg of
//handle your messages here
end;
end;
您可以使用SendMessage
或PostMessage
发送消息,前者会阻塞直到消息被处理,后者则是异步的。
希望这能帮助您。
AllocateHwnd()
方法。相反,你可以使用PostThreadMessage()
将消息直接发送到主线程的消息队列中,使用MainThreadID
变量作为目标线程ID。然后使用TApplication.OnMessage
事件来接收这些消息。你可以通过查看TMsg.hwnd
成员来区分一个线程消息和一个窗口消息,因为对于线程消息来说,它将为零。 - Remy Lebeau
AllocateHWnd
。 - Sertac Akyuz