gpt4 book ai didi

multithreading - TThread 在 Delphi 2006 控制台应用程序中的工作方式是否不同?

转载 作者:行者123 更新时间:2023-12-03 14:57:28 24 4
gpt4 key购买 nike

我们有一个相当成熟的 COM dll,我们使用 DUnit 对其进行测试。我们最近的测试之一创建了一些线程,并从这些线程测试对象。当使用 GUI 前端运行测试时,此测试工作正常,但在作为控制台应用程序运行时挂起。这是我们测试内容的快速伪 View

SetupTest;
fThreadRefCount := 0; //number of active threads
Thread1 := TMyThread.Create(True);
Inc(fThreadRefCount);
Thread1.OnTerminate := HandleTerminate; //HandleOnTerminate decrements fThreadRefCount
Thread3 := TMyThread.Create(True);
Inc(fThreadRefCount);
Thread2.OnTerminate := HandleTerminate; //HandleOnTerminate decrements fThreadRefCount
Thread3 := TMyThread.Create(True);
Inc(fThreadRefCount);
Thread3.OnTerminate := HandleTerminate; //HandleOnTerminate decrements fThreadRefCount

Thread1.Resume;
Thread2.Resume;
Thread3.Resume;

while fThreadRefCount > 0 do
Application.ProcessMessages;

我尝试在 OnExecute 中不执行任何操作,因此我确信这不是我正在测试的实际代码。在控制台中,fThreadRefCount永远不会递减,而如果我将它作为GUI应用程序运行,那就没问题了!

据我所知,OnTerminate 事件并未被调用。

最佳答案

您需要提供更多数据。

请注意,OnTerminate 是通过 Synchronize() 调用的,这需要在某个时刻调用 CheckSynchronize()Application.ProcessMessages() 通常会执行此操作,但根据 VCL 的初始化方式,Synchronize() 机制可能尚未完全连接在一起控制台应用程序。

无论如何,这个程序在我的机器上按预期工作:

uses Windows, SysUtils, Classes, Forms;

var
threadCount: Integer;

type
TMyThread = class(TThread)
public
procedure Execute; override;
class procedure Go;
class procedure HandleOnTerminate(Sender: TObject);
end;

procedure TMyThread.Execute;
begin
end;

class procedure TMyThread.Go;
function MakeThread: TThread;
begin
Result := TMyThread.Create(True);
Inc(threadCount);
Result.OnTerminate := HandleOnTerminate;
end;
var
t1, t2, t3: TThread;
begin
t1 := MakeThread;
t2 := MakeThread;
t3 := MakeThread;
t1.Resume;
t2.Resume;
t3.Resume;
while threadCount > 0 do
Application.ProcessMessages;
end;

class procedure TMyThread.HandleOnTerminate(Sender: TObject);
begin
InterlockedDecrement(threadCount);
end;

begin
try
TMyThread.Go;
except
on e: Exception do
Writeln(e.Message);
end;
end.

关于multithreading - TThread 在 Delphi 2006 控制台应用程序中的工作方式是否不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/272987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com