目标是在两个线程之间创建通信,其中一个是主线程。我正在寻找的是创建一个占用较少资源的窗口,并将其用于仅接收消息。
你能告诉我什么?
答案 0 :(得分:7)
这是message-only windows的用途。我在a previous question编写了一个Delphi发送+接收系统示例。
答案 1 :(得分:7)
您需要做的是在线程中设置一个消息循环,并在主线程中使用AllocateHWnd来向后和向前发送消息。这很简单。
在你的线程执行函数中有以下内容:
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);
在主线程方面,使用AllocateHWnd(在Classes单元中)设置一个窗口句柄,并传递一个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
异步执行消息。
希望这有帮助。
答案 2 :(得分:2)
Gabr的OmniThread Library提供了一个很好的小单位DSiWin32,您可以使用它来创建消息窗口,或者您可以使用OmniThread为您进行通信。