1


私のアプリケーションは、数マイクロ秒ごとに別のプロセスを一時停止して再開する必要があります。
不均一な時間のためにプロセスを一時停止しているように感じる場合があります。
私は win API を使用します:ResumeThreadSuspendThread.

一方で、ちょっと変わったことをしてみました。
いつものようにスレッドを一時停止しましSuspendThreadたが、再開すると次のようになります。

while (ResumeThread(threadHandle) > 0);

より高速に動作し、他のプロセスを均一なペースで実行します。
なぜそれが起こるのですか?スレッドが 2 回中断されて ResumeThread コマンドが実行されることがありますか?
ありがとう :)

4

3 に答える 3

3

SuspendThread()call はスレッドを即座に中断しません。実行コンテキストの保存には時間がかかるためResumeThread()、スレッドがまだ中断されていないときに呼び出される可能性があります。それが機能する理由while (ResumeThread(threadHandle) > 0);です。現在のスレッドの状態を判断するには、NtQueryInformationThread()を呼び出すことができますが、これは Windows の NT バージョンでのみ可能です。

セカンダリ スレッドにループがある場合は、手動リセット イベントで同期を変更できます。プライマリ スレッドはResetEvent()、スレッドを中断しSetEvent()て再開するために呼び出す必要があります。ループごとに呼び出す必要があるセカンダリ スレッドWaitForSingleObjectEx()

于 2011-04-19T19:17:27.550 に答える
0

Damonの提案に従い、コードから一時停止/再開を削除し、代わりに同期オブジェクトを使用しました。これにより、プールスレッドは作業の完了後に無限に待機し、作業を割り当てた後にサーバースレッドによって同じことが通知されます。

サスペンドを使用する必要があるのは、初めてスレッドを作成し、スレッドに作業を割り当てた後、サーバー スレッドからスレッドを再開するときだけです。作成されたスレッドは、スレッド プールで何度も使用されて何らかの作業を行います。

それは魅力のように働いています。

デイモンありがとう!

よろしく、

アジェイ

于 2014-09-04T09:58:34.227 に答える