問題タブ [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.
windows - 単純なマルチスレッドミューテックスの例は正しくありません
0から4までの数字をランダムな順序で取得することを期待していますが、代わりに、同期されていない混乱が発生しています
私は何を間違えますか?
asynchronous - ループでWaitForSingleObjectの代わりにWaitForMultipleObjectsを使用する利点は何ですか?
私は持っていvector<HANDLE>
ます。全部終わるのを待ちたいです。それらを配列にコピーしたくありません。ループWaitForMultpleObjects
で使用するのではなく、とにかくそうして使用することの利点は何ですか?WaitForSingleObject
ありがとう!
c++ - 複数のミューテックスでの Windows 同期
私はこれについてはっきりしていません、誰かが私のためにこれを確認できますか?
次の同期の問題があります。次のオブジェクトがあります。
そして、アクセス条件は次のとおりです。
- B または C がオンの間は、A をブロックする必要があります。
- B は、A がオンの間だけブロックする必要があります。
- C は、A がオンの間のみブロックする必要があります。
そのため、2 つの名前付きミューテックスを使用することを考えました。
- hMutex2 = 上記の条件 2 を満たすために使用されます。
- hMutex3 = 上記の条件 3 を満たすために使用されます。
- hStopEvent = 停止イベント (アプリが閉じている場合はスレッドを停止する必要があります)。
Aの場合:
B の場合:
C の場合:
誰かがこれを確認できますか:
- 両方のミューテックスで WaitForMultipleObjects を呼び出すと、両方ともシグナル状態 (またはブロック) になりますか?
- また、両方のミューテックスを解放する必要がありますか?
c++ - WaitForMultipleObjects() で std::vector を使用する
std::vector
ハンドル オブジェクトがあります。関数で使用するために、これらのハンドル オブジェクトを待つ必要がありWaitForMultipleObjects
ます。これはベクトルなので、で使用中にエラーが発生しますWaitForMultipleObjects
:
これを行う方法はありますか?
c++ - WaitForSingleObject の待機タイムアウト
WaitForMultipleObject
waitForAll パラメータ = true の関数を使用しています。ここでは std::vector
、待機するハンドル オブジェクトを使用しています。この関数がタイムアウトした場合、タイムアウトしたハンドルを待機していることをどのように特定できますか??
c++ - C++ で waitformultipleobject を使用する方法
クライアント接続を待機するコードを作成しようとしています。クライアントに接続されるとすぐに、ファイルの読み取りと送信を開始する必要があります。
ソケットハンドルの通知が必要です。つまり、クライアント側から接続が失われた場合、再接続を試みることができるように通知されます。
winapi - MsgWaitForMultipleObjectsEx を使用して確認すると、WM_USER の PostMessage が到着しないようです。
タスクを投稿できるいくつかのスレッドループを持つプログラムがあります。これらのスレッド ループの 1 つが UI スレッド ループです。投稿されたタスクだけでなく、ウィンドウ メッセージも処理する必要があるため、WM_USER メッセージを送信して、ディスパッチ ループでスレッドを起動します。
問題は、時々 (特に や のような他のウィンドウ メッセージがたくさんあるWM_PAINT
場合WM_RESIZE
)、私のWM_USER
メッセージがスレッドを起こさないことです。理由はわかりませんが、関数は呼び出しPostMessage
からスレッドを起こさないようです。MsgWaitForMultipleObjectsEx
これは次のようになります (簡単にするためにいくつかの言い換えがあります)。
編集:上記への直接呼び出しMsgWaitForMultipleObjectsEx
は単純化されました。私は実際に次のような関数を呼び出します。
winapi - SerialPortsとWaitForMultipleObjects
クロスプラットフォームアプリケーション(Linux組み込みおよび実際の組み込みターゲットを使用)のシリアルポートに問題があります。これは、開発を容易にするためにWindowsでも機能します。これはWindowsの実装についてです。
したがって、シリアルプロトコルの実装は、OSシステムと非OSシステムの混合を対象としており、実装自体には触れません。既存の実装と互換性を持たせたいです。それが妥当な時間内に失敗した場合は、シリアル読み取り用に別のスレッドを作成します。
OK、基本的に実装はシリアルポートを開き、ファイル記述子をIOシステム(epoll
LinuxとWaitForMultipleObjects
Windowsで使用)に登録し、基本的にすべてのハンドルを待って必要なことを実行します。したがって、ハンドルに読み取りの信号が送信されたときに、シリアルポートから読み取りを行います。残念ながら、Windowsでは、読み取りと書き込みのどちらを待機しているかを指定できないため、次の解決策を使用すると思いました。
CreateFile
とFILE_FLAG_OVERLAPPED
SetCommMask
とEV_RXCHAR
OVERLAPPED
手動リセットイベントを使用して構造を作成するWaitCommEvent
上記の構造で呼び出しOVERLAPPED
ます。これは通常、ERROR_IO_PENDING
これが基本的な設定です。待機するファイルハンドルの代わりにイベントハンドルを登録します。ハンドルが通知されたら、次のようにします。
ReadFile
- 成功した場合は、もう一度
ResetEvent
お電話くださいWaitCommEvent
ただし、を指定する場合はFILE_FLAG_OVERLAPPED
、読み取りと書き込みにもオーバーラップIOを使用する必要があるようです。だから、いつでもReadFile
、またはWriteFile
戻ってきたら、とERROR_IO_PENDING
でIOを待つだけだと思いました。でも、私はそれには入らないようです。基本的には機能しているように見えますが、オーバーラップがまだアクティブであるかのように、呼び出しの1つでクラッシュすることがあります(ただし、クラッシュすることはないはずです)。WaitForSingleObject
GetOverlappedResult
ResetEvent
だから、実際の質問。これは私が望むように行うことができますか?一般的なアプローチに問題がありますか、それとも機能するはずですか?それとも、さらに別のスレッドを使用することが唯一の良い解決策ですか?通信はすでに別のスレッドにあるため、少なくとも3つのスレッドになります。
シリアル読み取りに直接関係のない多くのものを含む実際のコードからは削減されていますが、必要なだけコードを投稿しようと思います。
コンストラクターは別のスレッドで呼び出され、後でOpenを呼び出します。
次に、スレッドはかなり長いチェーンを介して、構造体のメンバーと同じWaitForMultipleObjects
m_を呼び出します。これはループで実行され、リストには他にもいくつかのハンドルがあります。そのため、シリアルポートから排他的に読み取るスレッドがある一般的なソリューションとは異なります。基本的に、ループを制御することはできません。そのため、(内で)適切なタイミングで実行しようとしています。waitHandle
hEvent
OVERLAPPED
WaitCommEvent
InitWait
ハンドルが通知されると、ReadDataメソッドがスレッドによって呼び出されます。
書き込みは、同期せずに次のように実行されます。
今は動作しているようです。クラッシュはもうありません、少なくとも私はそれらを再現することはできません。ですから、今はうまく機能しているので、私がしていることは正気であるのか、それとも別のことをすべきなのかを尋ねているだけです。
c++ - 作成されたプロセスのベクトルのみが与えられた複数のオブジェクトを待機する
create process を使用して実行したプロセスからのハンドルのベクトルがあります。それを WaitForMultipleObjects(v.size, "code going here",true,∞); に渡す方法を考えています。
ループしてプロセスを作成するたびに、ハンドル ベクターに PROCESS_INFORMATION のハンドル フィールドを入力します。