我们有一个相当成熟的 COM dll,我们使用 DUnit 对其进行测试。我们最近的一项测试创建了几个线程,并从这些线程中测试对象。此测试在使用 gui 前端运行测试时运行良好,但在作为控制台应用程序运行时挂起。这是我们在测试中的快速伪视图
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 事件只是没有被调用。