問題タブ [waitformultipleobjects]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
15637 参照

windows - 単純なマルチスレッドミューテックスの例は正しくありません

0から4までの数字をランダムな順序で取得することを期待していますが、代わりに、同期されていない混乱が発生しています

私は何を間違えますか?

0 投票する
1 に答える
1078 参照

asynchronous - ループでWaitForSingleObjectの代わりにWaitForMultipleObjectsを使用する利点は何ですか?

私は持っていvector<HANDLE>ます。全部終わるのを待ちたいです。それらを配列にコピーしたくありません。ループWaitForMultpleObjectsで使用するのではなく、とにかくそうして使用することの利点は何ですか?WaitForSingleObject

ありがとう!

0 投票する
3 に答える
459 参照

c++ - 複数のミューテックスでの Windows 同期

私はこれについてはっきりしていません、誰かが私のためにこれを確認できますか?

次の同期の問題があります。次のオブジェクトがあります。

そして、アクセス条件は次のとおりです。

  1. B または C がオンの間は、A をブロックする必要があります。
  2. B は、A がオンの間だけブロックする必要があります。
  3. C は、A がオンの間のみブロックする必要があります。

そのため、2 つの名前付きミューテックスを使用することを考えました。

  • hMutex2 = 上記の条件 2 を満たすために使用されます。
  • hMutex3 = 上記の条件 3 を満たすために使用されます。
  • hStopEvent = 停止イベント (アプリが閉じている場合はスレッドを停止する必要があります)。

Aの場合:

B の場合:

C の場合:

誰かがこれを確認できますか:

  • 両方のミューテックスで WaitForMultipleObjects を呼び出すと、両方ともシグナル状態 (またはブロック) になりますか?
  • また、両方のミューテックスを解放する必要がありますか?
0 投票する
4 に答える
2519 参照

c++ - WaitForMultipleObjects() で std::vector を使用する

std::vectorハンドル オブジェクトがあります。関数で使用するために、これらのハンドル オブジェクトを待つ必要がありWaitForMultipleObjectsます。これはベクトルなので、で使用中にエラーが発生しますWaitForMultipleObjects:

これを行う方法はありますか?

0 投票する
2 に答える
438 参照

c++ - WaitForSingleObject の待機タイムアウト

WaitForMultipleObjectwaitForAll パラメータ = true の関数を使用しています。ここでは std::vector、待機するハンドル オブジェクトを使用しています。この関数がタイムアウトした場合、タイムアウトしたハンドルを待機していることをどのように特定できますか??

0 投票する
2 に答える
342 参照

c++ - C++ で waitformultipleobject を使用する方法

クライアント接続を待機するコードを作成しようとしています。クライアントに接続されるとすぐに、ファイルの読み取りと送信を開始する必要があります。

ソケットハンドルの通知が必要です。つまり、クライアント側から接続が失われた場合、再接続を試みることができるように通知されます。

0 投票する
3 に答える
1834 参照

winapi - MsgWaitForMultipleObjectsEx を使用して確認すると、WM_USER の PostMessage が到着しないようです。

タスクを投稿できるいくつかのスレッドループを持つプログラムがあります。これらのスレッド ループの 1 つが UI スレッド ループです。投稿されたタスクだけでなく、ウィンドウ メッセージも処理する必要があるため、WM_USER メッセージを送信して、ディスパッチ ループでスレッドを起動します。

問題は、時々 (特に や のような他のウィンドウ メッセージがたくさんあるWM_PAINT場合WM_RESIZE)、私のWM_USERメッセージがスレッドを起こさないことです。理由はわかりませんが、関数は呼び出しPostMessageからスレッドを起こさないようです。MsgWaitForMultipleObjectsEx

これは次のようになります (簡単にするためにいくつかの言い換えがあります)。

編集:上記への直接呼び出しMsgWaitForMultipleObjectsExは単純化されました。私は実際に次のような関数を呼び出します。

0 投票する
1 に答える
3738 参照

winapi - SerialPortsとWaitForMultipleObjects

クロスプラットフォームアプリケーション(Linux組み込みおよび実際の組み込みターゲットを使用)のシリアルポートに問題があります。これは、開発を容易にするためにWindowsでも機能します。これはWindowsの実装についてです。

したがって、シリアルプロトコルの実装は、OSシステムと非OSシステムの混合を対象としており、実装自体には触れません。既存の実装と互換性を持たせたいです。それが妥当な時間内に失敗した場合は、シリアル読み取り用に別のスレッドを作成します。

OK、基本的に実装はシリアルポートを開き、ファイル記述子をIOシステム(epollLinuxとWaitForMultipleObjectsWindowsで使用)に登録し、基本的にすべてのハンドルを待って必要なことを実行します。したがって、ハンドルに読み取りの信号が送信されたときに、シリアルポートから読み取りを行います。残念ながら、Windowsでは、読み取りと書き込みのどちらを待機しているかを指定できないため、次の解決策を使用すると思いました。

  • CreateFileFILE_FLAG_OVERLAPPED
  • SetCommMaskEV_RXCHAR
  • OVERLAPPED手動リセットイベントを使用して構造を作成する
  • WaitCommEvent上記の構造で呼び出しOVERLAPPEDます。これは通常、ERROR_IO_PENDING

これが基本的な設定です。待機するファイルハンドルの代わりにイベントハンドルを登録します。ハンドルが通知されたら、次のようにします。

  • ReadFile
  • 成功した場合は、もう一度ResetEventお電話くださいWaitCommEvent

ただし、を指定する場合はFILE_FLAG_OVERLAPPED、読み取りと書き込みにもオーバーラップIOを使用する必要があるようです。だから、いつでもReadFile、またはWriteFile戻ってきたら、とERROR_IO_PENDINGでIOを待つだけだと思いました。でも、私はそれには入らないようです。基本的には機能しているように見えますが、オーバーラップがまだアクティブであるかのように、呼び出しの1つでクラッシュすることがあります(ただし、クラッシュすることはないはずです)。WaitForSingleObjectGetOverlappedResultResetEvent

だから、実際の質問。これは私が望むように行うことができますか?一般的なアプローチに問題がありますか、それとも機能するはずですか?それとも、さらに別のスレッドを使用することが唯一の良い解決策ですか?通信はすでに別のスレッドにあるため、少なくとも3つのスレッドになります。


シリアル読み取りに直接関係のない多くのものを含む実際のコードからは削減されていますが、必要なだけコードを投稿しようと思います。

コンストラクターは別のスレッドで呼び出され、後でOpenを呼び出します。

次に、スレッドはかなり長いチェーンを介して、構造体のメンバーと同じWaitForMultipleObjectsm_を呼び出します。これはループで実行され、リストには他にもいくつかのハンドルがあります。そのため、シリアルポートから排他的に読み取るスレッドがある一般的なソリューションとは異なります。基本的に、ループを制御することはできません。そのため、(内で)適切なタイミングで実行しようとしています。waitHandlehEventOVERLAPPEDWaitCommEventInitWait

ハンドルが通知されると、ReadDataメソッドがスレッドによって呼び出されます。

書き込みは、同期せずに次のように実行されます。

今は動作しているようです。クラッシュはもうありません、少なくとも私はそれらを再現することはできません。ですから、今はうまく機能しているので、私がしていることは正気であるのか、それとも別のことをすべきなのかを尋ねているだけです。

0 投票する
2 に答える
513 参照

c++ - 作成されたプロセスのベクトルのみが与えられた複数のオブジェクトを待機する

create process を使用して実行したプロセスからのハンドルのベクトルがあります。それを WaitForMultipleObjects(v.size, "code going here",true,∞); に渡す方法を考えています。

ループしてプロセスを作成するたびに、ハンドル ベクターに PROCESS_INFORMATION のハンドル フィールドを入力します。