帮忙看一下我的线程为什么没执行,谢谢!(30分)

  • 主题发起人 主题发起人 孤云
  • 开始时间 开始时间

孤云

Unregistered / Unconfirmed
GUEST, unregistred user!
Unit UTHREAD;
interface
USES
Classes,Math,SysUtils,DateUtils;
TYPE
TInOPTThread=class(TThread)
private
{....}
protected
proceduredo
InOPT;
procedure Execute;
override;
public
{....}
constructor Create(CreateSuspended:Boolean);
end;


implementation
CONSTRUCTOR TInOPTThread.Create(CreateSuspended:Boolean);
begin
FreeOnTerminate := True;
inherited Create(CreateSuspended);
end;

PROCEDURE TInOPTThread.Execute;
begin
FreeOnTerminate:=True;
WHILE Truedo
begin
IF Terminated then
Break;
Synchronize(DoInOPT);
end;
end;

PROCEDURE TInOPTThread.DoInOPT;
begin
........//执行部分
........
end;
end.

Unit Unit1
。。。。。
implementation
use UTHREAD;
procedure start;
begin
.......
.......
TInOPTThread.Create(True);//跟踪调式时,在这和线程中的DoInOPT设置断点,
程序执行到这的时候直接跳过去,执行下面分部分
不见DoInOPT的程序执行
.......
.......
end;
请问怎么才能正确启用线程,并让线程的DoInOPT部分执行,谢谢!
 
TInOPTThread.Create(False);
constructor Create(CreateSuspended: Boolean);
Description
Call Create to create a thread in an application. If CreateSuspended is False, Execute is called immediately. If CreateSuspended is True, Execute won抰 be called until after Resume is called.
 
PROCEDURE TInOPTThread.Execute;
begin
//FreeOnTerminate:=True;这句前面有了,不要再写
WHILE terminateddo
begin
Synchronize(DoInOPT);
end;
end;
----------------------
TInOPTThread.Create(false);//false:创建线程后不挂起;true:创建后挂起,当然不会执行了
 
注意,应该是while not terminateddo
 
可以把线程事件里的FreeOnTerminate:=True;都去掉,等会在执行时用OnTerminate来触发线程事件执行完后再执行的事件。
Unit Unit1
。。。。。
implementation
use UTHREAD;
procedure start;
var t1:TInOPTThread;
--------定义一个线程变量
begin
.......
.......
t1:=TInOPTThread.Create(false);
--------这里改成false,否则是挂起的
t1.OnTerminate:=ondone;
---------这样程序就必须等TInOPTThread的结果出来后再执行后面的事件。
.......
.......
end;

procedure ondone(Sender: TObject);
-----------定义线程执行完后的要执行的事件
begin
.......
end;
 
在你的procedure start里面如果线程的CreateSuspended为true的话需要调用resume线程才能执行的,CreateSuspended的意思是是否让创建的时候就执行,如果为true的话线程创建的时候就是Suspended状态(挂起),当然不会执行任何execute过程的语句了。
要么让CreateSuspended为false,要么在CreateSuspended为true之后加一句:
TInOPTThread.Create(True);
TInOPTThread.Resume;//加上这一句,线程就执行了
 
多人接受答案了。
 
后退
顶部