如何判断线程是否正在运行?(50分)

D

Dong_HC

Unregistered / Unconfirmed
GUEST, unregistred user!
如题!
我用的是DELPHI自带的线程类
 
没人会?
还是现在这里面人太少?
 
重载
published
property terminated;
property suspended;
 
方法太多了,用一个变量做标记就可以做到。
 
谢谢楼上两位!
to 差不多算了
这个我听别人说了,但现在我不知道这个东西写在哪?如何调用?谢谢
to 张辉明
怎么标记?设一个变量?当线程运行是付个值?结束时再付个值?如果异常退出怎么办?
 
的确不难;
我前面回答其他网友的相关问题中有方法, 我自己也测试过的, 可行.
 
所以还是重载最简单,
TFindDataThread = class(TThread)
private
protected
procedure Execute;
override;
public
constructor Create;
destructor Destroy;
override;
published
property terminated;
property suspended;
end;
 
ls啊, 你不是差不多, 你是差得多了;
// 文不对题
 
晕,真菜,还文不对题呢。
 
创建一个实例,就可以随时获取这个实例的状态了,比用变量要好
 
试试这样 。
手里有没有编译环境,瞎写一下哈。。。
在TForm中定义一个变量标识。FActive: Boolean;
然后定义消息。
WM_begin
= WM_USER + 1001;
WM_END = WM_USER + 1002;
Type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
public
procedure WMbegin
(var Msg: TMessage);message WM_begin
;
procedure WMEnd(var Msg:TMessage);message WM_end;
end;

var
Form1: TForm1;
tt: TTestThread;
//实现
procedure TForm1.FormCreate(Sender: TObject);
begin
tt := TTestThread.Create(Handle, False);
end;
procedure TForm1.WMbegin
(var Msg: TMessage);
begin
FActive := True;
end;
procedure TForm1.WMEND(var Msg: TMessage)
begin
FActive := False;
end;

然后在线程类中,如TTestThread = class(TThread)
private
FHandle: THandle;
protected
procedure Execute;override;
Constructor Create(Handle: THandle;
CreateSuspended: Boolean);
end;

Constructor TTestThread.Create(Handle:THandle;
CreateSuspended: Boolean);
begin
FHandle := Handle;
inherited Create(CreateSuspended);
end;
procedure TTestThread.Execute;
begin
SendMessage(FHandle, WM_begin
, 0, 0);
//DoSomething;
SendMessage(Fhandle, WM_END, 0, 0);
end;
 
搞得这么麻烦,实际上用WaitForSingleObject就行了
 
if GetExitCodeThread(hThread,VarExitCode) <> STILL_ACTIVE then
线程已经结束
 
看需求了,如果是想在什么地方探测某线程是否结束,然后决定做什么,那么用“ysp娃娃”的方法简便,
而如果是想在某线程结束后自动运行后续代码,则用WaitForSingleObject,线程也是一个可等待内核对象,线程结束后WaitForSingleObject函数才返回,然后继续执行后续代码。
 
ysp娃娃 的方法是最把握的
 
我要学的真是太多了,再做一个记号,
消息是不是就是事件的一个类型呀?
 
顶部