問題タブ [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.
windows - WaitForSingleObject(INVALID_HANDLE_VALUE、INFINITE)がブロックされるのはなぜですか?
どして
ブロック?エラーメッセージは返されません。INVALID_HANDLE
ミューテックスハンドルにアクセスするにはミューテックスが必要になるため、ハンドルをチェックするのはミューテックスにとってばかげています...
ところで:WAIT_FAILED
ハンドルが閉じられた場合、それは戻ります。
winapi - Win32 ミューテックスが待機していません
プロセス間通信を実装するアプリケーションを作成しています。この目的のために、私は共有バッファを設定しました。これは正常に機能しているようです。ここで、データ生成アプリケーション (c++ で記述) がデータ受信アプリケーション (freepascal/lazarus で記述) にいつデータを読み取る必要があるかを伝える方法が必要です。
この目的のためにミューテックスを使用しようとしていました。Windows API プログラミングの経験はあまりありません。
したがって、私の問題は、以下の FreePascal コードでは、ミューテックスが待機しないことです。TMutex.Wait() 関数を呼び出すことができます。エラーなどは返されませんが、単に待機しません。
コンストラクタ TMutex.Create(sName: AnsiString);
sNameを開始し
ます:= 'Local\Mutex'+sName;
hMutex := CreateMutexA(
nil, // デフォルト アクセス
True, // 最初は所有されていない
PChar(sName)); // 名前付きミューテックス
hMutex = 0 の場合は、例外の発生を
開始します。Create
('mutex の作成に失敗しました');
終わり;
終わり;
デストラクタ TMutex.Destroy; CloseHandle(hMutex)
を開始します。 終わり; 手順 TMutex.Wait; begin if (WaitForSingleObject(hMutex, INFINITE) <> 0) then ShowMessage('debug: 何かが返されるのを待つ'); 終わり;
手順 TMutex.Post; ReleaseMutex(hMutex)
を開始します。 終わり;
windbg - WaitForSingleObject()での非常に奇妙なwindbgの動作
以下は私のプログラムであり、windbgを使用したWaitForSingleObject()呼び出しでプロセスがブロックされたときに、呼び出しスタックを取得しようとしています。奇妙なことに、プロセスがブロックされているとき、windbgは非常に奇妙なスタックしか出力しません。
行のコメントを外すとwhile(1)
、windbgはプロセスが_tmain
関数でブロックされていることを認識できることに注意してください。
ありがとう。置き場
debugging - 2 つのサードパーティの実行可能ファイルをぶら下げている同期オブジェクトの認識
サードパーティのプラグインを使用するサードパーティのツールを使用しています。時折、起動時にツールがハングします。スタック トレースを見ると、いくつかのスレッドが WaitForSingleObject を待機していることがわかります。おそらく、これらのスレッドは互いにブロックしているのでしょう。一部のスレッドはサードパーティのツールで開始され、一部はサードパーティのプラグインで開始されます。
私がやりたいことは、サード パーティのツール ベンダーに最も詳細な苦情を申し立てることです (サード パーティのツール ベンダーのせいだと仮定して) (ローカル サポートがそれらの詳細を自分で取得できるとは思えません)。そのために、私はしたいと思います:
- 現在待機中の同期オブジェクトを確認する
- これらの同期オブジェクトの作成者を見つける
現在手元にあるツールは、VS2005、WinDbg、および Process Explorer です。OSはwindow7 64bitです。助言がありますか?
c++ - WaitForSingleObject の後、変数が状態を保持しないのはなぜですか?
私はネットワーク クラスの Go Back N プロトコルを実装しています。WaitForSingleObject を使用して、受信スレッドのソケットにデータが含まれていることを認識しています。
Go Back N の場合、一度に複数のパケットを受信者に送信し、データを操作してから、ACK パケットを送信者に送り返す必要があります。ACK を送信するたびにインクリメントする変数 expectedSEQ があるので、パケットが順不同で到着したかどうかがわかります。
ただし、最初のパケットが到着すると、デバッガーは expectedSEQ がインクリメントされていることを通知しますが、次のパケットが操作されているとき、expectedSEQ は元の値のままです。
なぜこれが起こっているのか誰にも分かりますか?if文をそのまま入れたら
2 番目のパケットは正しく登録され、ack を送信します。明らかに、これは 2 tho を超えるパケットの量に対しては機能しません。
セクション全体 (元の WaitForSingleObject を含む) をセマフォでラップして、変数がインクリメントされるまですべてを待機させようとしましたが、これも機能しませんでした。
ご協力いただきありがとうございます!
エリック
リクエストごと: もっとコードを!
multithreading - Thread.finalization を待機し、アプリケーションの応答性を維持する正しい方法はどれですか
実際、私はこのコードを使用していて問題なく動作しますが、正しい方法であるかどうか疑問に思っています。
multithreading - マルチスレッド Delphi 7 アプリ - アプリの終了に関する問題
TThread の子孫とオブジェクトのリストがあり、それぞれにそのようなスレッドの独自のコピーがあり、CreateEvent() API で作成された Event オブジェクトがあります。
異なるオブジェクトは、イベントの発火によって相互に作用します。つまり、各スレッドは、他のスレッドがそのイベントを発生させるまで待機する必要があります。もちろん、永続的に機能する「マスター」スレッドが 1 つあるため、セルフブロッキングは発生しません。このシステムは、各オブジェクトの Execute メソッドの最後まで問題なく機能します。
アプリを閉じるなどして、すべてのスレッドを中断しようとすると、probkem が表示されます。この場合、各スレッドの Terminate メソッドを呼び出す外部関数が必要です。
この関数は Form.OnClose() イベントにあります。
問題は、約 2 つのスレッドが正常に終了することですが、他のすべては WaitForSingleObject() 呼び出しで停止します。
すべてのスレッドがその行で停止(ハング) します。タイムアウト値が設定されているにもかかわらず、上記でマークされています。
何か案は?
Delphi 7 と Win XP を使用しています。
前もって感謝します。
ファローアップ -
この問題は、Execute() メソッド内からの Synchronize() 呼び出しでカバーされていることがわかりました。ここで何が悪いのか理解できません。Synchronize() は、ビジュアル コントロールの更新などの通常のことを呼び出しますが、それ以上は何もしません。
デバッガーが示すように、一部のスレッドが WaitForSingleObject() 呼び出しでハングしていますが、これは異なるスレッドを調整するために Execute() メソッドで使用するものではなく、別の呼び出しです。私はそれがここにあると推測できます:
私のコードのどこが間違っているのか教えてくれる人はいますか? Execute() メソッド内から Synchronize() を呼び出すことが許可されていないとは聞いたことがありません...
php - PHP、実行中の別のスクリプトによってイベントが通知されるまでスクリプトの実行を一時停止しますか?
ある PHP スクリプトが、別のスクリプトの実行中に送信されるイベントを待機するようにします。
ユーザー A とユーザー B はどちらも私の Web サイトの訪問者です。ユーザー A が index.php にアクセスすると、ページの実行が開始されますが、ユーザー B も index.php にアクセスするまで戻りません。(このページは、両方のユーザーが Web サーバーに接続している場合にのみ表示されます。たとえば、2 人の警備員が同時に鍵を回して金庫を開けた場合などです。)
これを実現する 1 つの方法は、他のユーザーが index.php にアクセスしたことによる通知を受信するまで、index.php の実行を一時停止することです。
これを行うために、私は見ました
- libevent; ただし、シグナリング中に「ID」または「文字列」を送信することは許可されていないようです。
- pear の Event_Dispatcher; ただし、スクリプトの「間」では機能しません。
- PHP 共有メモリ関数; しかし、メモリが変更されるまで待つことができないようです。
winapi - CreateProcess が実際にいつプロセスを開始したかを知るにはどうすればよいですか?
要するに が欲しいという問題CreateProcess
がありStartProcess
ます。問題は、プロセスを作成CreateProcess
したときに true が返されたにもかかわらず、システムがプロセスを開始できなかった状況があることです。たとえば、起動対象のインポートの 1 つが解決できない場合でも成功します。CreateProcess
このプロセスを開始することによって、私が何を達成したいのかに応じて、おそらく多くの提案が可能です。ただし、このプロセスを開始することによって特に何かを達成することを望んでいないため、これらの提案はどれも役に立たない可能性が高いと思います.
WaitForSingleObject
一例として、プロセス ハンドルに対してを呼び出してからGetExitCodeProcess
. しかし、プロセスが永遠に残る可能性があるため、プロセスが終了するのが待ちきれません。
もう 1 つの提案例はWaitForInputIdle
、 を呼び出すことです。これは、起動対象が作成することを合理的に期待できるウィンドウを使用して、起動対象と通信したい場合にうまく機能します。しかし、私はそれを望んでおらず、合理的に期待することはできません. 私が知っている限りでは、起動対象はコンソール プロセスであり、メッセージ キューはありません。同様に、(ヒューリスティックな意図で) 見つけ出すのを待つ余裕もありません。
実際、ランチャーについては何も推測できません。
ここで私がどのように考えているかをよりよく理解するために、この問題の裏側を見てみましょう。プロセスが開始されない場合、ユーザーにアドバイスする方法を示すエラー コードが必要です。インポートがすべて解決され、メイン スレッドが CRT スタートアップ コード (または同等のコード) にジャンプしようとしていることを認識し、返されたエラー コードがERROR_SUCCESS
. しかし、私は実際にはランチャーに興味がなく、ランチャーで優れたユーザー エクスペリエンスを提供したいと思っているだけです。
ああ、もう 1 つ: これをシンプルにしたいのです。デバッガーを書きたくありません。:-)
アイデア?
delphi - Delphi7のCreateprocessで開いたプロセスに文字列または情報を送信するにはどうすればよいですか。
createprocessを使用して開いたプロセスに文字列を送信するにはどうすればよいですか?
私はここStackoverflowで見つけたものの助けを借りてこのようなものを書きました:
だから私が欲しいのは、プロセスが終了したときに(singleobjectを待つ直後に)行を書き、次に「Enter」ボタンを押して、最後にプロセスが終了したときにプロセスを閉じることです。誰かが外部プロセスと対話する方法を知っていますか?プログラミングに関しては、私はまったくの初心者です。
よろしくお願いします