我们有一个相当成熟的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事件根本没有被调用。