2016-07-14 15 views
0

特定の時間内に関数を実行しようとするスレッドを作成する必要があります。スレッドが成功しなかった場合は、エラーを示す数字でスレッドを終了する必要があります。MFCスレッドにタイムアウトを設定する方法

実行しなければならないプログラムの外部ライブラリが原因ですが、準備ができていないリソースを検索する際に無限ループを入力することがあります。 。

+0

開発プロセスを開始しましたか?コードを共有してください。 – ddb

+0

スレッドを終了すると、保持しているロックと外部リソースは解放されません。 –

+2

そして、正しいのですが、@ RichardCrittenのコメントは、それほど危険なほどには聞こえません。ロックが中心的な役割を果たす一般的なシナリオは、ヒープアクセスをシリアライズすることです。 [スレッドを終了する](https://msdn.microsoft.com/en-us/library/windows/desktop/ms686717.aspx)スレッドがメモリを割り当てている途中で、後でメモリを割り当てようとすると同じヒープは決して解放されないロックで待機します。だからあなたはデッドロックでループを無限に交換した。それはある方向への一歩です。ただ前進しません。 – IInspectable

答えて

1

フォールトを起こした場合、そのスレッドを安全にシャットダウンする方法がないため、フォールトしている実装を同じプロセス内の別のスレッドにオフロードすることで、この問題を解決することはできません。外部からスレッドを取り下げる唯一の方法は、TerminateThreadを呼び出すことです。結果として、プロセスを確実に実行し続ける必要がある場合は、そのプロセスを使用することはできません。例えば

のTerminateThreadは、以下の問題が発生することができます。

  • ターゲットスレッドがクリティカルセクションを所有している場合は、クリティカルセクションが解放されることはありません。
  • ターゲットスレッドがヒープからメモリを割り当てる場合、ヒープロックは解除されません。
  • 終了時にターゲットスレッドが特定のkernel32呼び出しを実行している場合、スレッドのプロセスのkernel32状態が矛盾する可能性があります。
  • ターゲットスレッドが共有DLLのグローバル状態を操作している場合、DLLの状態が破壊され、DLLの他のユーザーに影響を与える可能性があります。

あなたの唯一のオプションは以下のとおりです。

  1. サードパーティのライブラリのベンダーからのバグ修正を要求します。
  2. サードパーティライブラリを独自のプロセスにオフロードします。このサロゲートプロセスでは、独自のスレッドでサードパーティライブラリを実行できます。時間内に返されない場合は(WaitForSingleObjectでタイムアウト値を使用して条件を判断してください)、ExitProcessを呼び出して不幸を終了します。これが機能するには、プロセス間にinterprocess communicationsを実装する必要があります。