想法是这样的,创建线程后,根据需要执行,现场执行完后,不注销,下次还要继续启用执行。
现在的问题是第一次执行后,第二次我不知道怎么调用,我创建的时候是create(true),第一次resume正常执行线程,onterminate事件也正常执行,但是第二次我不清楚用什么方式执行了,还是线程只能一次性的,第二次又需要从新创建?
还有一个问题OnTerminate执行完毕后,线程是处于什么状态,我TForm1.Button2Click(Sender: TObject);时间中调用线程Terminated是False,按直观理解,应该是True啊。请大侠帮忙解答下。{ TMyThread }constructor TMyThread.Create(ASuspended: Boolean);
begin
inherited Create(ASuspended);
end;procedure TMyThread.Execute;
begin
inherited; ShowMessage('3');
end;{ TForm1 }procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(FMyThread) then FMyThread.Destroy;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
if not Assigned(FMyThread) then
begin
FMyThread := TMyThread.Create(True);
FMyThread.OnTerminate := ThreadTerminate; FMyThread.Resume
end
else FMyThread.Resume
end;procedure TForm1.ThreadTerminate(Sender: TObject);
begin
ShowMessage('jieshule');
end;procedure TForm1.Button2Click(Sender: TObject);
begin
if FMyThread.Terminated then ShowMessage('Terminated')
else ShowMessage('not Terminated');
end;
现在的问题是第一次执行后,第二次我不知道怎么调用,我创建的时候是create(true),第一次resume正常执行线程,onterminate事件也正常执行,但是第二次我不清楚用什么方式执行了,还是线程只能一次性的,第二次又需要从新创建?
还有一个问题OnTerminate执行完毕后,线程是处于什么状态,我TForm1.Button2Click(Sender: TObject);时间中调用线程Terminated是False,按直观理解,应该是True啊。请大侠帮忙解答下。{ TMyThread }constructor TMyThread.Create(ASuspended: Boolean);
begin
inherited Create(ASuspended);
end;procedure TMyThread.Execute;
begin
inherited; ShowMessage('3');
end;{ TForm1 }procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(FMyThread) then FMyThread.Destroy;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
if not Assigned(FMyThread) then
begin
FMyThread := TMyThread.Create(True);
FMyThread.OnTerminate := ThreadTerminate; FMyThread.Resume
end
else FMyThread.Resume
end;procedure TForm1.ThreadTerminate(Sender: TObject);
begin
ShowMessage('jieshule');
end;procedure TForm1.Button2Click(Sender: TObject);
begin
if FMyThread.Terminated then ShowMessage('Terminated')
else ShowMessage('not Terminated');
end;
begin
repeat
// do something
Suspend;
until Terminated;
end;
http://blog.csdn.net/jankercsdn/article/details/8874469
关于线程退出处理,还是有不完善的地方,实际使用中有改动,以后整理了再发。
TGaugeThread = class(Tthread)
protected
procedure Execute;override;
end;二、声明一个线程全局变量。一个boolean变量,用于自己控件关闭线程
var
MyThread:TGaugeThread;
ThreadOn:Boolean;三、写一个实现部分
procedure TGaugeThread.Execute;
var i: integer;
begin
ThreadOn:=True;
ThreadEnd:=False;
FreeOnTerminate:=true;
i:=0;
repeat
i:=i+1;
if i>=99 then i:=1;
GaugeFrm.Gauge1.Progress:=i;
application.ProcessMessages;
sleep(75);
until Terminated or ThreadEnd;
GaugeFrm.close;
ThreadOn:=False;
end;四、调用线程(可以多次调用)
MyThread:=TGaugeThread.Create(False);五、关闭线程
ThreadEnd:=False
所以说,你想让线程一直活着随时让你使用,就不能让Execute结束。那么你在Execute里就需要写一个循环(while/repeat),空闲时Sleep一下防止占用cpu太多,有任务时,设置一下某个变量,Execute里的循环检查到这个变量后继续执行任务(这个任务可以是其他你写好的函数或者过程)。
begin
while not terminated do
begin
DoSomeThing;
FEvent.WaitFor(INFINITE);
end;
end;如果要线程再跑一次, 把FEvent带上信号,FEvent.SetEvent;
下面是我写的com口通讯的起停。procedure TAlmDev.Start;
begin
try
FComPort.Open;
FStop := False;
except on e: exception do
MsgBox(Format('%s: %s', [FComPort.Port, e.message]));
end;
//
if FComPort.Connected and (FComThread = nil) then
begin
FComThread := TCommThread.Create(Self);
end;
end;procedure TAlmDev.Stop;
begin
FStop := True;
FComPort.Stop;
//
if FComThread <> nil then
begin
FComThread.Free;
FComThread := nil;
end;
//
FComPort.Close;
end;2。如果是起停非常频繁,类似于用在线程缓冲池的时候,就可以用事件,使线程在不用的时候处于阻塞状态,用到时候发送信号给事件,线程就开始循环了。3。还有一种用法比较特殊,就是在外部线程中,调用 suspend 和 resume来起停线程,不过这种方法不常用,主要是起停的时候线程运行状态不太好确定。针对楼主说的已经触发 ontermitate事件,说明线程已经销毁了,不可能在resume了。