如何确定一个线程是否已运行完成?(100分)

  • 主题发起人 主题发起人 mrzhou
  • 开始时间 开始时间
M

mrzhou

Unregistered / Unconfirmed
GUEST, unregistred user!
现在本人继承TTHREAD类生成了一个新的线程类,在线程内没有对VCL控件的访问,
但在另一个进程里需要确定该线程是否在运行,然后决定该做什么事情,但是却找
不到一个方法来解决这一问题。
线程变量在没有被实例化时,该变量为NIL,但当线程结束时该变量却不会变成NIL,
所以不知如何实现。
请各位大侠帮忙。
 
没有人能答吗?
 
你可以设一个变亮来判断其是否运行
 
(1)启动线程+用API函数
WaitForSingleObject(handle,//线程句柄
INFINITE //等待时间
));
WaitForMultipleObjects(ThreadCount,// 线程数量
@CloseHandle(线程数组),
true,
INFINITE);
//等待时间
就可以了,不过要在一个线程里用这个函数,用一个启动线程来做
(2)在线程结素的是时候用postmessage发送一个自定义消息给主窗口,主窗口再响应就
行了。
 
delphi中的线程对象不是有一个Terminated属性吗?不知道这是不是你要的回答。
 
哪个属性只要你在线程的主循环你用 not terminated才有用。
 
用OnTerminate事件
 
关键我要在外面判断
 
那给这个Thread设一个public 属性值,最好是boolean,这样就可以在外面判断了
 
可以在線程的execute結束前將該線程的變量定為nil,
最好還將FreeOnTerminate屬性設定為True, 讓Execute結束後, 自動釋放線程實例
不過, 這只適用於該線程類, 同一時間只有一個線程實例時適用
如果同一時間有多個線程類, 則此方法不太適用;
解決方式可以如張無忌所說, 為線程類加一個boolean屬性, 在Execute結束前設定為True;
不過要注意的是線程的FreeOnTerminat屬性不可設定True, 因為設定為True時, 線程實例
會在Execute執行完畢後自動釋放;
但實例變量還是指向原實例位, 存取時就會出錯了!!
 
在线程结素的是时候用postmessage发送一个自定义消息给主窗口,
主窗口在启动线程前,建一个线程状态变量,
主窗口收到这个消息后,改变这个线程变量值,
如果有多线程,同时建一个记数变量,收到消息INC(),到了线程数量就改变这个值,
在程序里你就可以通过这个值来判断线程状态
 
mythread=TmyThread.Create;
mythread.OnTerminate:=myproc;
..
..
 
可以使用API函数GetExitCodeThread()得到线程的退出吗来判断
 
如果需要判断我觉得最好做一个变量
线程里还需要加
mythread.Terminate:= True;
mythread:= Tmythread.create;
if mythread<>nil then
//线程未完成
或者用devil-li方法都可以
 
无忌的可以!
仔细的看看帮助说明!
 
使用TEvent. 有个WaitFor函数。 帮助里面有个很好的Demo介绍了它的用法。
//----------------------------------------------------
进程之间的信息传递可以通过CreateFileMapping共享内存实现。
 
在主线程设置一个 IsExited 属性,子线程的 Execute 最后插入一行:
IsExited := False;
 
这个问题是用一个公共变量来实现,判断线程变量是否为NIL是不行的,线程在执行完后不会自己将自己置为NIL。
 
多人接受答案了。
 
后退
顶部