USB経由でハードウェアと通信するインターフェースDllを書いています。ハードウェアのタイミング要件を完全に満たすために (操作メッセージなどがない状態でタイムアウトしないようにするため)、「Open()」メソッドが呼び出されるとすぐに、遅延初期化ごとにワーカー スレッドを作成します。「close()」メソッドが呼び出されると、ワーカー スレッドによって監視される名前付きの「terminate」イベントを設定し、ワーカーが終了するのを待ちます。いくつかのメッセージをハードウェアと交換する必要があるため、終了には数百ミリ秒かかります。
これまでのところ、唯一の問題は、プログラムが "Close()" メソッドを呼び出さずに Dll をアンロードするときです... DllMain (PROCESS_DETATCH) で "terminate" イベントを設定することでこれを解決しました。 m が許可されていても、ベスト プラクティスを完全に満たすことができます。唯一の問題は、close を呼び出さずに Dll がアンロードされ、古いワーカー スレッドが終了する前に再度リロードされた場合です。古いワーカー スレッドが終了するのを待っているため、DLL をロードするプロセスでタイムアウトが発生します。
だからここに私の質問があります:たとえば500ミリ秒のタイムアウトでDllMain(PROCESS_DETATCH)で終了するワーカースレッドを待機しますか?プロセス全体が終了したときではなく、lpvReserved パラメータを調べてテストしますか?
また、私の問題を一般的に解決するより良い方法はありますか?