Multithreading 线程自动启动

Multithreading 线程自动启动,multithreading,delphi,delphi-xe3,Multithreading,Delphi,Delphi Xe3,我的thread类是自动启动的,尽管suspended属性设置为true。 我有一个基类,它是thread类的数组。这是我的班级宣言 Type cSolution = Class(TThread) Private procedure FindLocalMinimum; procedure AddWorker; procedure RandomSortCompressors; procedure FindBestNetwork; Public Network : cNetwork; Worke

我的thread类是自动启动的,尽管suspended属性设置为true。 我有一个基类,它是thread类的数组。这是我的班级宣言

Type

cSolution = Class(TThread)
Private
procedure FindLocalMinimum;
procedure AddWorker;
procedure RandomSortCompressors;
procedure FindBestNetwork;

Public
Network : cNetwork;
Workers : array of cWorker;
Compressors : array of cCompressorData;
IsAllWorkersDone : boolean;
ID : integer;

Procedure CreateWorkers;
Constructor Create; overload;   // This constructor uses defaults
Constructor Create(aNetwork : cNetwork; aCompressors : array of cCompressorData); overload; // Copy constructor
 Destructor  Destroy; override; //Destructor

procedure Execute; override;
end;

implementation
/// <summary>Default constructer
/// </summary>
constructor cSolution.Create;
begin
    inherited;
    IsAllWorkersDone := false;
    Suspended := true;
    ID := 99;
end;
类型
cSolution=Class(TThread)
私有的
程序查找局部最小值;
程序工人;
程序随机或压缩程序;
程序搜索网络;
公开的
网络:网络;
工人:cWorker的数组;
压缩器:cCompressorData数组;
IsAllWorkersDone:布尔值;
ID:整数;
程序工人;
构造函数创建;过载;//此构造函数使用默认值
构造函数创建(网络:cNetwork;aCompressors:cCompressorData数组);过载;//复制构造函数
毁灭者毁灭;覆盖//析构函数
程序执行;推翻
结束;
实施
///默认构造函数
/// 
构造函数cSolution.Create;
开始
继承;
IsAllWorkersDone:=false;
暂停:=真;
ID:=99;
结束;
我在调用execute函数的位置和execute函数的开头添加了断点。我叫它的地方永远不会被触发。但是execute函数本身的断点被触发。触发时,挂起的属性为false


我是否缺少一些东西,或者为什么线程在我不希望自动启动时自动启动

您需要在构造函数中调用
继承的Create(True)
。这将避免启动线程


调用
inherited Create()
后,将
Suspended
设置为
True
仍将导致启动线程(Delphi在该区域有几个bug…

您的意思是它可以在挂起之前运行:=True。。。或者被挂起:=true被忽略?谢谢,这很有效。我认为将suspended属性设置为true与调用create(true)是一样的,这里没有“Delphi bug”。问题在于错误地调用构造函数,从而在默认(非挂起)状态下创建线程。线程在
Suspended:=True之前已经(正确)运行一直被调用。(你不能因为你在自己的代码中做了错误的事情而责怪Delphi的“bug”。)据我所知,这并不完全正确。在所有情况下(至少在windows环境中),线程都是在挂起状态下创建的,并且仅在AfterConstruction方法中启动。这意味着在构造函数中设置FCreateSuspended字段会起作用,但这当然是一个私有字段。事实上,原始代码不起作用的原因是它在后期构造中启动线程之前挂起了线程。@Kanitatlan:但是,Windows线程有一个与之相关联的挂起计数
Create(False)
将创建挂起的线程(count=1),然后
suspended:=true
将调用
SuspendThread()
(count=2),然后
TThread.AfterConstruction()
将调用
ResumeThread()
(count=1),直到再次调用
ResumeThread()
,线程才会运行(count=0).提示:
Execute
应作为受保护的方法重写,而不是升级为public。将其公开是有风险的,因为其他代码可能会直接调用它,这可能会导致意外的“效果”。