DUnit を使用してテストする、かなり成熟した COM dll があります。最近のテストの 1 つは、いくつかのスレッドを作成し、それらのスレッドからオブジェクトをテストします。このテストは、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 イベントは呼び出されていません。