当某个线程完成后,在不将该线程对象消除的前提下,如何让它再次运行Execute?(50分)

  • 主题发起人 主题发起人 xinyonghu
  • 开始时间 开始时间
注意不是一般的循环,而是消息循环,是用GetMessage的,如果没有消息,它是挂起的
 
很感兴趣,如何做消息循环?
 
to jamstina:
请注意我在上一贴的回答,我是说如果execute运行结束,线程就被操作系统释放,而
不是挂起。既然线程都没了,那调用suspend和resume当然没什么意义了。
 
同意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;
 
copy_paste关于GetMessage的描述是错误的
 
//呵呵,反正很少用它,没看它的帮助
回去用了一下,果然如此,多谢Pipi提醒,GetMessage果然可以提取线程消息队列的消息,
不过我一般用到Wait For,所以用GetMessage不是很好,虽然它有阻塞作用,不过它只是对
消息管用,而用WaitFor基本可以侦听多个事件的触发,所以我很少用,^_^
 
俺的办法难道不好吗?
一样是循环!使用比较简单,代码也比较简单!
一样是使用了suspend可以节省很多系统资源!
 
如果说线程不能再次调用的话,那么线程缓冲区TThreadList又有什么用呢?大家想想!
 
不知道“当某个线程完成后,在不将该线程对象消除的前提下,再次执行”和
“当某个线程完成后,将该线程对象消除,然后再次执行”的内存消耗是否相等?
 

Similar threads

后退
顶部