問題タブ [waitforsingleobject]

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 投票する
1 に答える
2736 参照

multithreading - WaitForSingleObject は WAIT_OBJECT_0 を返しますが、SetEvent は呼び出されませんでした

常に多くのスレッドを作成および破棄するプログラムでは、 がWaitForSingleObject()返されることがありますが、予期されたイベントが呼び出されませんでした。インターネットで情報を探してみましたが、同様のバグは見つかりませんでした。WAIT_OBJECT_0SetEvent()WaitForSingleObject()

このバグが発生する小さなテスト アプリケーションを作成しました。

EventsTest.dpr:

MainThread.pas:

WorkThread.pas:

CallBack.pas:

このアプリケーションでは、ループ処理用に多くのスレッドを作成し、常に作成および破棄する多くのスレッドを作成します。すべてのスレッドは、コールバック エミュレーションを使用してイベントを設定します。"WaitForSingleObject error"アプリケーションがバグを検出すると、コンソールに書き込みます。

WaitForSingleObject()と を使用しているスレッドは、SetEvent()で説明されていWorkThread.pasます。ではCallBack.pas、簡単なコールバック エミュレータについて説明します。そしてMainThread.pas、スレッドを管理します。

このアプリケーションでは、まれにバグが発生し、1 時間待たなければならないこともあります。しかし、多くの win ハンドルを持つ実際のアプリケーションでは、すぐにバグが発生します。

イベントの代わりに単純なブール値フラグを使用すると、すべて正常に動作します。システムのバグであると結論付けています。私は正しいですか?

PS: OS - 64 ビット アプリ - 32 ビット

アップデート

Remy Lebeau は私の間違いを指摘しました

CreateEvent(nil, False, False, '')すべてをに置き換えますがCreateEvent(nil, False, False, nil)、まだバグが発生します。

0 投票する
0 に答える
244 参照

windows - WaitForSingleObject とデッドロック

Windows での同期に関する記事を読みました。

ロック、デッドロック、および同期

デッドロックを避けるために、呼び出すKeEnterCriticalRegion()前に呼び出して、通常のカーネル モード APC 配信を無効にする必要があると言われています。KeWaitXxx()

私は理解した。KeEnterCriticalRegion()しかし、私の知る限り、ユーザーアプリケーションのような API はWaitForSingleObject()ないため、デッドロックに対して安全ではないようです。

それ以外の場合は、呼び出しでKeEnterCriticalRegion()内部的に呼び出されWaitForSingleObject()ますか?

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

delphi - 昇格されていないプログラムは昇格されたアップデーターを開始し、アップデーターはプログラムの終了を待つ必要があります

Program.exe と updater.exe の 2 つのアプリがあり、どちらも Delphi5 で記述されています。プログラムは管理者権限なしで (およびマニフェストなしで) 実行されます。アップデーターには「requireAdministrator」のマニフェストがあります。

問題は、アップデーターを起動して、プログラムが閉じられるまで彼を待たせることです。ウェブでさまざまな方法を見つけましたが、どれも機能しません (ほとんどの場合、最初のアプリは 2 番目のアプリを開始し、2 番目のアプリの終了を待ちます。私の場合、2 番目のアプリは 1 番目のアプリの終了を待つ必要があります)。

アップデータは待つ必要があります。それは簡単
です updater.exe

方法 1
CreateProcess:
program.exeでアップデーターを起動する

何もせず、requireAdministrator を含むマニフェストがアップデーターにない場合にのみ機能します。Explizit 管理者権限でプログラムを実行すると、それも機能します。

方法 2 ShellExecuteEx:
program.exeでアップデーターを起動する

MyHandle は、この手順を実行するたびに (プログラムを再起動せずに) 異なる値を持つため、アップデーターはそれを操作できません。

そのため、updater.exe を起動して、program.exe のハンドルをファイルに書き込む方法がわかりません。

私はプログラミングのこれらの部分にあまり詳しくありません...誰かが私の問題についてアイデアを持っていますか?

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

delphi - Delphi XE8: 外部コンソール アプリケーションの実行、その結果の待機、およびその結果の取得に関する問題

Windows の Delphi XE8 で、外部コンソール アプリケーションを呼び出して、その出力を取得しようとしています。Capture the output from a DOS (command/console) WindowおよびGetting output from a shell/dos app into a Delphi appで説明されているように、次のコードを使用します 。

DOS コマンドでは機能しますが、コンソール アプリケーションでは機能しません。コンソール アプリケーションは正しく起動して実行されますが、repeat until (Apprunning <> WAIT_TIMEOUT)ループでハングします。問題を解決するにはどうすればよいですか?

どうもありがとうございました!

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

c++ - WaitForSingleObject デッドロック

興味がある場合は背景を説明します。それ以外の場合は、下部の質問に直接行くことができます。

2 つのイベント オブジェクトの状態がシグナル状態になるかどうかをチェックする 2 つの条件で無限whileループが発生するという問題が発生しています。if

イベント オブジェクトはUSB_PHY_CONN、ハードウェア USB 接続を検出し、対応するイベント オブジェクトの設定USB_PHY_DISCONNに使用する OS/BSP USB ドライバー コードで設定されています。SetEvent()

のドキュメントを読むとWaitForSingleObject()、スレッド内で使用する必要があると明示的に述べられていませんが、何度も読んだ後、それが暗示されているように感じますが、100%確実ではありません.

私が抱えている問題は、コードが while ループを初めて実行したとき (つまり、usb が最初に切断され、次に接続され、切断された)、システムが正常に動作し、ハングしないことです。ただし、USB を再接続すると、システムがフリーズします。デバイスが応答しなくなり、UI がフリーズし、コードが失われます。

さて、上記のコードが含まれているプロセスを強制終了すると、すべてが元に戻り、正常に動作し続けます。いくつか読んだところWaitForSingleObject()、デッドロックの可能性があるようですが、それは常にスレッドに関するものであることに気付きました。

私の質問はWaitForSingleObject()スレッドで使用する必要がありますか? メインの無限ループで使用すると、デッドロックやシステムのフリーズが発生するリスクが高くなりますか?

注: これは、VS2008 を使用したプラットフォーム ビルダー Windows 組み込み CE 7 プロジェクトです。

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

c++ - WaitForMultipleObjects の代わりに if 条件で 2 つの WaitForSingleObject

2つのWaitForSingleObjectを「if」条件に入れるのは有効な方法ですか? そして、 WaitForMuiltipleObjectを使用して書き直すことができることを知っています。しかし、以下のコードを使用すると問題が発生するかどうかを知りたかった..?

0 投票する
0 に答える
147 参照

c++ - すべてのリスナーに通知する方法

アプリケーションにいくつかのプロセスがあります。1 つは共有メモリに書き込み、もう 1 つは WaitForSingleObject を使用してグローバルな名前付きミューテックスをリッスンします。ライター プロセスで ReleaseMutex を呼び出すと、1 つのリスナーだけが起動します。

書き込み操作が完了したら、何らかの形ですべてのプロセスに通知する必要があります。c# の pulseall のように、すべてのリスナーをウェイクアップする方法はありますか?

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

c# - WaitForSingleObject は ERROR_INVALID_HANDLE を返します

プロセスがまだ生きているかどうかを判断しようとしています (確認した時点では、確認を行った直後にプロセスを閉じることができることを認識していWaitForSingleObject()ます) Process.MainWindowHandle。そして_IsIconic()WAIT_FAILEDGetLastError()ERROR_INVALID_HANDLE

0 投票する
0 に答える
226 参照

c++ - PDF に出力すると、WaitForSingleObject 呼び出しでメイン アプリケーションがハングする

mshtml.dll と rundll.32.exe を使用して特定のデータを印刷するこのアプリケーションがあります。Windows 10 で、"Microsoft Print to PDF" または "Microsoft XPS Document Writer" をプリンターとして選択すると、アプリケーションがハングします。タスクマネージャーでタスクを終了すると、「印刷出力を名前を付けて保存」ダイアログが表示されます。実際のプリンターでは問題ありません。

これがそのコードスニペットです。

アプリケーションがハングするコードを分離しました。それは WaitForSingleObject() 呼び出しにあります。それは決して終わらず、「印刷出力を名前を付けて保存」ダイアログが表示されないようにブロックしています。INFINITE を 10000 (10 秒) に変更すると、[印刷出力を名前を付けて保存] ダイアログが表示されますが、実際のプリンターで印刷出力をテストし、10 秒間待機すると、ハンドルまたはプロセスが閉じられたため、データは印刷されません。 CloseHandle() 呼び出しによって。

あなたが私を助けてくれることを願っています。

Jonathan Potter によって提案された MsgWaitForMultipleObjectsEx を見て、このスレッドを 理解することで解決策を見つけました MsgWaitForMultipleObjectsを理解する