同意mywyn,线程对象也同样也是一个对象,在Delphi运行线程时,它的FreeOnTerminate只是一个
用于在线程中,让线程对象结束后,可能它会有一些值保留下,这时有必要使这个线程对象不要
Free,以使我们使用它的某些值,但是在运行完Execute后,不管FreeOnTerminate是True/False,
这个(begin
thread)建立起来的线程已经消息,留下的只是一个是否(FreeonTerminate)释放掉的对象
为真时,就像平时Free对象一样被析构完了.这时候线程完成后再用Execute, Resume,Suspend(FreeOnTerminate=False),已经
没有任何意义.或者说现在再调用就像调用Object.method那样,已经没有多线程的味道了
对于线程消息,我个人用的最多的是PeekMessage来为当前的线程创建一个自己线程队列
和取消息,当另外的线程MainThread可以通过PostThreadMessage来与之交互.
>>而GetMessage我觉得它是用来取得Current Application All Message,所以我很少用它.(Error)
GetMessage是可以得到线程消息队列的消息,它与Peekmessage的区别在于:
一个阻塞(Getmessage)线程,一个则不会Peekmessage,而PeekMessage要初始化线程队列(如下)
type
TMyThread = class(TMyThread)
private
FEvent: THandle;
protected
procedure Execute;
override;
property Event: THandle read FEvent;
end;
procedure TMyThread.Exceute;
var
msg: TMsg;
begin
FEvent := CreateEvent(nil, True, False, nil);
PeekMessage(msg, WM_USER, WM_USER, PM_NOREMOVE);
while not Terminateddo
case MsgWaitForMultipleObjects(1, Event, False, TimeOut, QS_ALLINPUT) of
WAIT_OBJECT_0: { SetEvent(Event) }
WAIT_OBJECT_0 + 1: { PostThreadMessage to me}
WAIT_TIMEOUT:
end;
CloseHandle(FEvent);
end;