上司が午前中休みのためミーティングは無し。
この前の土曜日に休日出勤した社員に、測定ソフトが起動しなくて出荷前の機械の動作チェックが出来ずに迷惑した、といったことを言われてしまった。起動できなくなっていた直接の原因は、前日の金曜日に上司が高負荷での動作を見ようといじったときに設定ファイルが変になったからだった。
私はその日は休みをとっていて、起動できなくなったことはメールで連絡を受けていたが、彼の土曜出勤のことを聞いていなかったので週末に復旧する必要があるとは思わなかった。
もちろんこれは、そのような異常な設定を読み込んだ場合を想定していなかった私の予想が甘かったわけで、早速コードを修正した。
午後からは別のバグの調査。プログラムを終了した後、まれにプロセスが終了せずに残ってしまうことがある。おそらくマルチスレッドのいずれかがきちんと終了していないのだと思われる。

このプログラムでは、スレッドはVCLのTThreadを継承したクラスに実装している。それらのスレッドクラスのスレッド本体(TThread::Execute())では、無限ループの中で、「キューが空なら停止(Suspend)」「空でなければキューからデータを取り出して処理」という動作をする。停止中のスレッドはキューに要素が追加されたときにキュー側から再開(Resume)される。無限ループ中ではTerminatedプロパティがチェックされていて、Terminatedがtrueであれば無限ループは終了し、さらにスレッドも終了する。
スレッドクラスを破棄する場合は、Terminatedをtrueにした上でスレッドを再開して確実に無限ループを抜けさせないといけない。もしスレッドが停止中であればTerminatedをtrueにしただけではスレッドは停止状態のまま残ることになる。
おそらくこれがプロセスが残る原因だと思う。それを踏まえてスレッドクラスのデストラクタを修正してみたが、まだ解決できてない。何か見落としがあるのか、原因は他にあるのか。