我想将一个消息处理函数放到线程里,该怎么做?(100分)

  • 主题发起人 主题发起人 squire
  • 开始时间 开始时间
S

squire

Unregistered / Unconfirmed
GUEST, unregistred user!
我在mainform里定义了一个procedure OnMessageRecv(var msg: TMessage);
message WM_USER
这样当有大量的WM_USER消息到来后mainform界面可能会停顿,所以我想把这个消息处理函数放到一个线程里,在delphi里该怎么做呢?
大侠指点,谢谢
 
在线程中响应消息

type
TMyThread=class(TThread)
private
FOwner:TControl;
FOwnerProc:TWndMethod;
FMessage:TMessage;
FEvent :TSimpleEvent;
procedure ThreadWndProc(var Message:TMessage);
constructor Create(AOwner:TControl);
destructor Destroy;
protect
procedure Execute;override;
end;

constructor TMyThread.Create(AOwner:TControl);
begin
inherited Create(True);
FOwner:=AOwner;
if Assigned(FOwner) then
begin
FOwenrProc:=AOwner.WindowProc;
FOwner.WindowProc:=ThreadWndProc;
end;
FEvent:=TSimpleEvent.Create;
end;
destroy TMyThread.Destroy;
begin
if Assigned(FOwner) then
FOwner.WindowProc:=FOwnerProc;

FEvent.Free;
inherited Destroy;
end;

procedure TMyThread.ThreadWndProc(var Message:TMessage);
begin
if Message.Msg=WM_DESTROY then

begin
FOwner.WindowProc:=FOwnerProc;
FOwnerProc:=nil;
FOwner:=nil;
end;
if Message.Msg=所要处理的消息 then
begin
FMessage:=Message;
FEvent.SetEvent;
end
else
if Assigned(FOwnerProc) then
FOwnerProc(Message);

end;
procedure TMyThread.Execute;
begin
while not Terminateddo
begin
FEvent.WaitFor(INIFILE);
FEvent.ResetEvent;
....//根据FMessage处理消息
end
end;
 
请问ThreadWndProc是不是接受系统的所有消息,那我在使用postMessage向这个线程发消息时第一个参数handle添谁的handle呢?
 
触发两次,太慢了,影响效率,一般不这样做,使用createfilemapping做共享数据空间,采用creat event做触发机制,效率极高,不容易跑偏
 
后退
顶部