再问如何在线程中如何响应消息(200分)(200分)

  • 主题发起人 主题发起人 张德华
  • 开始时间 开始时间

张德华

Unregistered / Unconfirmed
GUEST, unregistred user!
我的线程中要创建进度显示的窗体,然后把线程句柄(ThreadID)告诉窗体(自己用
PUBLIC变量保存),当窗体上的取消按钮按下时,发消息给线程,线程在响应消息
后在安全适当的时候中断线程,可是我无法都捕获到消息,ThreadWinProc把消息都
过滤了!
希望大家能给出详细的解决办法,谢谢!
 
自己写一个ThreadWinProc嘛!
 
用POSTTHREADMESSAGE
 
给分!
----------------
在线程中响应消息
----------------
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;

 
如果只是终止线程的话,直接调用 TThread.Terminate 就可以了,Terminate 并不会立即
结束线程,而是设置 Terminated 为 True ,这样你的线程循环就可以在安全的时候判断 Terminated
然后退出循环,结束线程。
 
线程运行时先调用PeekMessage(@msg, NULL, WM_USER, WM_USER, PM_NOREMOVE)
建立线程消息队列.
然后主进程就可以用PostThreadMessage与线程通讯了
 
多人接受答案了。
 
后退
顶部