请问如何判断一个线程正在运行? ( 积分: 50 )

  • 主题发起人 主题发起人 hxmuser
  • 开始时间 开始时间
H

hxmuser

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何判断一个线程正在运行?
万望赐教
 
请问如何判断一个线程正在运行?
万望赐教
 
线程的问题,如何判断其是否活跃。急!!! (30分)
分类:多线程 wicked (2003-05-02 9:43:00)
请先看下面代码
procedure TForm1.Timer2Timer(Sender: TObject);
begin
if 线程1不活跃 then
procedure1
end;
我是想在timer事件中判断线程不活跃时,就执行procedure1,但是我不知道如何判断指定线程是否活跃,请高手指点!!!
另外,请注意这是在timer事件中!!!
谢谢

张无忌 (2003-05-02 9:47:00)
你难道不能设置一个标志,我不知道你判断线程活跃的标准是什么?
本来WIN9X。WIN NT都是分时间片执行线程的,执行你的代码的时候,
其他线程都是挂起,所以你这个判断的结果都是一样,其他线程不
活跃

wicked (2003-05-02 10:06:00)
对不起,应该是这样:
procedure TForm1.Timer2Timer(Sender: TObject);
begin
if 线程1不活跃 then
do
线程1
end;
怎么判断,另外我还想让线程1结束后,不再运行(因为是在timer事件中),请问如何实现?
能给我个简单的代码吗?

小笨苯 (2003-05-02 10:16:00)
线程对象的Suspended为true就表示线程处于被挂起状态。
你能不能把你要实现什么功能说出来呀?

诸葛白痴 (2003-05-02 10:17:00)
procedure TForm1.Timer2Timer(Sender: TObject);
begin
if 线程1不活跃 and not 已经运行过(在线程1运行时设这个变量为true) then
do
线程1
end;
你是用来判断线程1是否在运行吧,不活跃是什么意思,如果是是否在运行可以用Terminated

wicked (2003-05-02 10:34:00)
我的想法是:1.如果线程A不存在的话,就运行它;
2.运行线程A一次后就不再运行;
3.我想让主程序自动判断,所以加入了timer。
谢谢!

远帆 (2003-05-02 10:45:00)
1.如果线程A不存在的话,就运行它;(应该是创建它吧?)
2.运行线程A一次后就不再运行;(设定FreeOnTerminate:=True;即可)

小笨苯 (2003-05-02 10:45:00)
1.>>如果线程A不存在的话,就运行它;
你打算怎么判断呀?判断实例是否存在吗?Assigned(实例)?
2.>>运行线程A一次后就不再运行
这是什么意思呀?是想让它运行一次就自动删除了呢?还是暂时不删除,挂起呢?
3.次要的,上面的问题清楚了,这个就不是问题了

wicked (2003-05-02 11:12:00)
1.我另外有一个自己建立的过程用来创建线程A并完成一些事情,线程A应该就算实例了把
2.由于是自己创建的过程,所以我想运行一次就删除线程A,下次再调用过程就是了。
3.等再有任务来时,由于timer的存在,所以会判断出线程A是否存在。如果不存在的话,就
调用我自己创建的过程来建立线程A。
4.我想1-3的过程是往复的,就是想让程序具有一定的只能性。
谢了!

xwings (2003-05-02 12:14:00)
re:1
线程A是实例。你的procedure直接创建线程并挂起,设定一些资源,然后设置线程的resume
re:2
创建线程的时候设置freeOnTerminate := true 这样线程的Execute过程运行结束之后会自动free,不用你去删除
re:3
你的timer是不断检测任务呢还是不断检测线程?
任务来了应该有个触发的事件,无论是你timer检测到的还是其他过程,如果线程A不存在就调用1里面的过程创建。如果线程A存在你要如何处理?
另外判断线程A是否Free有很多方法,可以设置一个全局变量,在线程A的Create的开始设置为true,Destroy时候设置为false。还有很多其他办法...

wicked (2003-05-04 14:00:00)
其实我是通讯过程中使用线程,进程1向进程2发消息,进程2始终进行监视(所以设置了Timer)
,一旦进程2检测到有任务(Timer中检测),就调用线程做任务,然后把结果返回!
我疑惑的地方就是如何在Timer事件中判断线程的状态,如下:
1。如果线程已经在执行时,就不需要再创建线程了
2。要判断线程的状态,一旦结束后就把结果返回
熟悉线程的朋友请帮忙!谢了!

xwings (2003-05-04 14:25:00)
既然你在线程2设置timer来进行监视,那为什么不在主线程中设置timer监视呢?
判断线程是否执行的方法我已经说过了。
其他的应该没有问题了吧?

wicked (2003-05-05 9:12:00)
多人接受答案了。

xwings-10,小笨苯-10,张无忌-10,的回答最终被接受。
 
我的一个过程,应该比较容易懂,而且直接就可以使用
其中参数aThread是你的线程变量
记得给分啊,呵呵
//判断线程是否释放
//返回值:0-已释放;1-正在运行;2-已终止但未释放;
//3-未建立或不存在
function TFrmMain.CheckThreadFreed(aThread: TThread): Byte;
var
i: DWord;
IsQuit: Boolean;
begin
if Assigned(aThread) then
begin
IsQuit := GetExitCodeThread(aThread.Handle, i);
if IsQuit then
//If the function succeeds, the return value is nonzero.
//If the function fails, the return value is zero.
begin
if i = STILL_ACTIVE then
//If the specified thread has not terminated,
//the termination status returned is STILL_ACTIVE.
Result := 1
else
Result := 2;
//aThread未Free,因为Tthread.Destroy中有执行语句
end
else
Result := 0;
//可以用GetLastError取得错误代码
end
else
Result := 3;
end;
 
建议对所有线程,一经做完事之后立即 free 掉!
 
给分,给分,证实可行就肯定给分,多谢各位大哥![:D]
 
小弟还想问一个问题:如果我想实现后台自动批量打印而不影响前台工作,使用多线程是不是最好的办法。请赐教!也有分给!
 
打印是会自己使用另外一个线程的。
 
不过我的打印是批量打印,是从数据库里自己读出数据然后一条一条的打印,不是打印一份。我需要程序在后台默默工作,多线程打印是最好的选择吗?
 
后退
顶部