【问题标题】:Thread auto starting线程自动启动
【发布时间】:2014-07-14 14:56:15
【问题描述】:

尽管suspended 属性设置为true,但我的线程类是自动启动的。 我有一个基类,它作为线程类的数组。这是我的班级声明。

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;

我在调用执行函数的地方和执行函数的开头添加了断点。我称之为的地方永远不会触发。但是执行函数本身的断点被触发了。当它被触发时,挂起的属性为假。

我是否缺少某些东西,或者当我不想让它自动启动时,为什么线程会自动启动。

【问题讨论】:

  • 提示:Execute 应该被重写为受保护的方法,而不是提升为公共。将其公开是有风险的,因为其他代码可以直接调用它,这可能会导致意想不到的“效果”。

标签: multithreading delphi delphi-xe3


【解决方案1】:

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

在调用inherited Create() 之后将Suspended 设置为True 仍然会导致启动线程(Delphi 在该区域有几个错误...)

【讨论】:

  • 你的意思是它可以在 Suspended := True ... 之前运行,还是 Suspended := true 被忽略?
  • 谢谢这工作。我虽然将 suspend 属性设置为 true 与调用 create (true) 相同
  • 这里没有“Delphi bug”。问题是错误地调用构造函数,该构造函数在默认(非挂起)状态下创建线程。在调用Suspended := True; 之前,该线程已经(正确地)运行。 (你不能责怪 Delphi 因为你在自己的代码中做错了什么而导致的“错误”。)
  • 据我所知,这并不完全正确。在所有情况下(至少在 Windows 环境中),线程都是在挂起状态下创建的,并且仅在 AfterConstruction 方法中启动。这意味着在构造函数中设置 FCreateSuspended 字段会起作用,但这当然是一个私有字段。事实上,原始代码不起作用的原因是因为它在 AfterConstruction 启动之前暂停了线程。
  • @Kanitatlan:但是,Windows 线程具有与其关联的挂起计数。 Create(False) 将创建挂起的线程(count=1),然后Suspended:=true 将调用SuspendThread()(count=2),然后TThread.AfterConstruction() 将调用ResumeThread()(count=1)并且线程不会运行直到再次调用ResumeThread() (count=0)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
相关资源
最近更新 更多