問題タブ [message-loop]
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.
ruby - メインスレッドではない WIN32OLE_EVENT::message_loop を使用する 問題
メイン スクリプトの実行中に OLE イベントを取得できるようにする Ruby スクリプトを作成しようとしています。WIN32OLE_EVENT::message_loop を別のスレッドに移動し、他のスクリプト部分の実行中にイベント ハンドラーが同時に呼び出されることを期待しています。たとえば、このサンプル スクリプトの主な目的は、デバイスに接続し、irb コンソールの実行中にイベント メッセージを取得することです (標準出力に出力するだけです)。
このスクリプトを実行すると (ただし、一部がスキップされたため実行できません)、irb コンソールが表示され、Windows に接続された USB デバイスを操作するオブジェクトにアクセスし、さまざまなイベントを発生させるいくつかのメソッドを呼び出すことができ、これらのイベントが期待されます。 stdout への出力を確認するためだけに esc.on_event ブロック内。しかし、このブロックは呼び出されませんでした。しかし、irb コンソールに「exit」と書くと、サンプル スクリプトの最後の行がWIN32OLE_EVENT::message_loopであるため、イベントが取得されます。
メインスレッドでのみ機能する message_loop を呼び出し、他のスレッド内で呼び出すと、結果が得られないように見えます。
それを機能させる方法はありますか?追加の質問をお気軽に。ありがとう。
multithreading - 個別のメッセージループを持つスレッドを終了するにはどうすればよいですか?
SetWindowsHookEx
APIのユーティリティユニットを書いています。
それを使用するには、次のようなインターフェイスが必要です。
私の現在の実装ではTKeyboardHookThread
、スレッドを正しく終了させることができません。
コードは次のとおりです。
AFAICSフックプロシージャは、スレッドにメッセージループがある場合にのみ呼び出されます。問題は、このメッセージループを正しく終了する方法がわからないことです。
TForm
スレッドに属するhiddenを使用してこれを実行しようとしましたが、メッセージループは、そのフォームのウィンドウハンドルに送信しているメッセージを処理しません。
スレッドのシャットダウン時にメッセージループが終了するように、これを正しく行うにはどうすればよいですか?
編集:私が現在使用しているソリューションは次のようになります(そして魅力のように機能します):
multithreading - スレッドのメッセージループを終了する方法は?
バックグラウンドスレッドは、ウィンドウメッセージを受信するように構成できます。を使用してスレッドにメッセージを投稿しますPostThreadMessage
。そのメッセージループを終了する正しい方法は何ですか?
バックグラウンド
バックグラウンドスレッドにメッセージを投稿する前に、スレッドは次の呼び出しによってメッセージキューが作成されていることを確認する必要がありますPeekMessage
。
これで、外の世界が私たちのスレッドにメッセージを投稿できるようになりました。
そして私たちのスレッドはGetMessage
ループにあります:
GetMessage
私の質問は、メッセージを受信してWM_QUIT
falseを返す正しい方法は何ですか。
メッセージを投稿する間違った方法は、次の電話をかけることであることWM_QUIT
をすでに学びました。
人々がこのアプローチを採用している例さえあります。MSDNから:
PostMessage関数を使用してWM_QUITメッセージを投稿しないでください。PostQuitMessageを使用します。
正しい方法は、「誰か」がを呼び出すことPostQuitMessage
です。PostQuitMessage
は特殊関数であり、メッセージキューに関連付けられた特殊フラグを設定して、適切なタイミングでメッセージGetMessage
を合成しWM_QUIT
ます。
これが「ウィンドウ」に関連付けられたメッセージループである場合、標準のデザインパターンは、ウィンドウが破棄され、WM_DESTROY
メッセージが受信されたときです。これをキャッチして、次のように呼び出しますPostQuitMessage
。
問題はWM_DESTROY
、ウィンドウマネージャーによって送信されることです。誰かが電話したときに送信されますDestroyWindow
。投稿するだけでは間違っていWM_DESTROY
ます。
今、私はいくつかの人工的なメッセージを合成することができWM_PleaseEndYourself
ました:
次に、スレッドのメッセージループで処理します。
しかし、スレッドのメッセージループを終了する標準的な方法はありますか?
しかし、これをしないでください
ウィンドウのないメッセージキューを使用しない方が、すべての人にとって良いことがわかります。メッセージをディスパッチするウィンドウがない場合、多くのことが意図せずに、そして微妙に壊れてしまう可能性があります。
代わりに、非表示のウィンドウを割り当て(たとえば、Delphiのスレッドを使用して-安全 AllocateHwnd
ではありません)、プレーンな古いウィンドウを使用してメッセージを投稿しますPostMessage
。
メッセージを処理するための単純な古いウィンドウプロシージャを使用できる場所:
スレッドを終了させたい場合は、次のように伝えます。
c++ - このプログラムにおけるメッセージ ループの役割は? そしてさらにいくつかの質問
次のコードは正常に動作します。ユーザーがキーを押すと、メッセージが表示されます。しかし、私が気づいていない特定のことがあります。ここでのメッセージ ループの役割は何ですか? SetWindowsHookEx(...)
呼び出しは関数をウィンドウに登録し、登録されたタイプのイベントが発生すると、ウィンドウは適切な関数を自動的に呼び出すことを読みました。メッセージループにスペースを与えないと、出力が表示されないことは間違いありません。
編集
プログラムを終了する(コンソール ウィンドウを閉じる)と、フックが登録解除されますか?
編集2
Dispatch Messageはここでどのような役割を果たしますか? ドキュメントによると、ウィンドウプロシージャにメッセージをディスパッチしますが、ここではそれを除外しても、出力には影響しません。
c++ - WindowsメッセージループでSleep()?
aSleep(sometime)
は典型的な無限ウィンドウ メッセージ ループで目的を果たしますか?それとも単に役に立たないか、有害でさえあるのでしょうか?
一部の例には が含まれていますがSleep
、ほとんどの例には含まれていません。
c++ - WM_CREATEに子ウィンドウを作成します。同じスレッドの関連性ですか?
典型的なパターンは、メッセージコールバック(WndProc
)のメッセージで子ウィンドウを作成することWM_CREATE
です。
これは良い機会だと完全に理解していますが、後でそれを行うのは問題ですか?その理由の1つは、子ウィンドウが同じスレッド内に作成されることです。しかし、他に理由はありますか?
そして、(親と)同じスレッドで子ウィンドウを作成することはどれほど重要ですか?「親GUIダイアログスレッドの子スレッドは子ウィンドウを作成できますか?」の時点では、これは一般的な問題ではないようです。
android - ハンドラーによって投稿されたRunnableは、間違ったオブジェクトの状態を認識します(競合状態?)
を使用してRunnablesとして投稿されたメソッドに表示される、オブジェクトの状態が間違っているという非常に奇妙な問題が発生していますHandler.postDelayed
。これを使用して、2D描画の描画呼び出しをスケジュールします。この描画コードは、特定の状態フィールド(intやbooleansなど)をチェックします。
描画をスケジュールした後にこれらの状態フィールドが変更される可能性がありますが、すべてのメソッド、遅延呼び出しも同じスレッドで実行されるため(右?)、共有状態による可視性の問題はないはずです。
それでも、抽選をスケジュールする前にフラグを設定し、再度触れないため、フラグがfalse
スケジュールされた抽選にある場合は、フラグが表示されない場合があります。true
いくつかの疑似サンプルコード:
これはどのように起こりますか?Androidがこれらのメッセージループをどのように実装するかは完全にはわかりませんが、描画をスケジュールするメソッドとスケジュールされたメソッド自体の両方でスレッドIDを確認し、両方が同じスレッド(メインUIスレッド)で呼び出されます。
これは私を夢中にさせています、誰かが助けることができますか?
更新 この問題は、フラグが内部クラスによって1回、外部クラスによって1回チェックされていることが原因であることに気付きました。描画コードは内部クラスの一部として実行され、フラグが正しい状態であると見なされますが、外部クラスは、内部クラスのインスタンスへの参照が含まれていても、常にフラグをfalse(誤った状態)と見なします。私はまだ問題を理解していませんが、それはクラスの入れ子に関連しているようですか?
wxwidgets - wxWidgetsで更新するようにGUIに通知する最もクリーンな方法は何ですか?
ソケットがオフラインになるなど、下位レベルでイベントが発生した場合に GUI 要素を更新する必要がある小さなアプリケーションがあります。
Windows では、チェーンを介してすべての Windows に送信される PostMessage を使用でき、それに応じて必要なものを更新できます。
wxWidgets で同様のことを実現するにはどうすればよいですか? 一部のコントロールはそれをまったく処理していないように見えるため、OnUpdateUI などを使用することはできません。
ターゲット ウィンドウは 1 つまたは複数の可能性があり、フレームまたはコントロールである可能性があるため、ここで少し混乱します。
誰か提案がありますか?
c# - Application.Run()、Application.Exit()およびタイマー
タスクスケジューラを介してファイルをダウンロードしてデータベースに挿入するために呼び出すwinformsアプリケーションがあります。ただし、ファイルがいつ利用可能になるかは予測できないため、タイマー(System.Windws.Forms.Timer
)を使用してファイルをポーリングしました。
上記のコードスニペットでは、OptionsTradedTimer
/OptionsStatsTimer
両方がファイルをポーリングしてから、で終わるプロセスを開始しますApplication.Exit()
。これは完全に実行されますが、その後、無限のメッセージループでスタックします。Application.Run()
最初のタイマーが作動した直後に呼び出されるので、Application.Exit()
最終的に呼び出されるとメッセージループが終了すると思いました。しかし、コードをステップスルーすると、その後Application.Exit()
、プログラムは元のtimer.tick()に戻りApplication.Run()
、下部のに進みます。Application.Run()
下部にあるが必要なのは、それがないとタイマーが1回だけ刻み、その後アプリが終了するためです。
では、どうすればアプリケーションに終了するように正しく指示できますか?または、どこに電話すればよいApplication.Run()
ですか?
c# - C# で UI コンポーネントを更新できません
ネットワーク上のさまざまなデバイスのステータスを監視するプログラムを作成しています。これらのデバイスの詳細はファイルに保存されます。HandleClientComm クラスは、これらのデバイスに関する情報をファイルから読み取り、それらとの tcp 接続を確立します。ファイルが読み取られた後、manEvent が通知に使用されます。UpdateGUI 関数は、デバイスごとに呼び出されます。data.caller が 1 の場合、そのデバイスのコントロールが追加されますが、グループ ボックスは無効になります。関数 hd.StartThreads は、Threadpool を使用してさまざまなデバイスからの接続をリッスンします。接続が受け入れられると、UpdateGUI 関数が data.caller 値 2 で再度呼び出されます。私の問題は、グループボックスが有効になっていないことです。メッセージ ボックスに「begin」と表示されますが、終了しません。グループボックス以外の他のコントロールにアクセスしようとしましたが、しかし、そこからどのコントロールにもアクセスできないことがわかりました。コードで無限ループが実行されていないため、メッセージ ループに問題がありますか?