問題タブ [event-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.

0 投票する
4 に答える
116045 参照

python - Tkinter:スレッドを使用してメインイベントループが「フリーズ」するのを防ぐ方法

「開始」ボタンと進行状況バーを備えた小さな GUI テストがあります。望ましい動作は次のとおりです。

  • [開始] をクリックします。
  • プログレスバーが 5 秒間振動する
  • プログレスバーが止まる

観測された動作は、[開始] ボタンが 5 秒間フリーズし、その後プログレスバーが表示される (振動なし) ことです。

これまでの私のコードは次のとおりです。

ここのBryan Oakley からの情報に基づいて、スレッドを使用する必要があることを理解しています。スレッドを作成してみましたが、スレッドはメインスレッド内から開始されるため、役に立たないのではないかと推測しています。

ロジック部分を別のクラスに配置し、そのクラス内から GUI をインスタンス化するというアイデアがありました。これは、A. Rodas のサンプル コードのようです

私の質問:

このコマンドを次のようにコーディングする方法がわかりません。

他のクラスにある関数を呼び出します。これは悪いことですか、それとも可能ですか? self.tb_click を処理できる 2 番目のクラスを作成するにはどうすればよいですか? 美しく機能する A. Rodas のサンプル コードに従ってみました。しかし、アクションをトリガーするボタン ウィジェットの場合、彼のソリューションを実装する方法がわかりません。

代わりに、単一の GUI クラス内からスレッドを処理する必要がある場合、メイン スレッドに干渉しないスレッドを作成するにはどうすればよいでしょうか?

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

javascript - ブラウザーで実行される JavaScript のシングル スレッドの概念

次の図は、Jon Resig著『 Secrets of the JavaScript Ninja』の第 3 章からの引用です。ここでは、著者がブラウザのイベント ループについて説明しています。

ここに画像の説明を入力

本はこう言わなければならない:

イベントをキューに入れるブラウザ メカニズムは、このイベント ループ モデルの外部にあることに注意してください。イベントがいつ発生したかを判断し、それらをイベント キューにプッシュするために必要な処理は、イベントを処理しているスレッドには参加しません。

私の質問は、ブラウザの JavaScript はシングル スレッドであると言うのは正しいですか? この質問をするのは、明らかに 2 つの別個のタスク (ここではイベントの処理とイベントのキューイングが並行して行われている) のためです。

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

c++ - Qtでは、イベントループのスレッドが所有するQObjectのスロットが実行されている間、QThreadのイベントループはブロックされますか?

Qt のワーカー スレッドの単純な側面であると私が信じていることを確認したいと思います。

対応するスレッドで時間のかかる作業を管理することを目的とする QThread を作成するとします。start()さらに、 QThreadを呼び出して、このスレッドの対応するイベント ループを実行できるようにするとします。作業自体は、QThread のシグナルによって通知されるメンバー関数 (スロット) によって実行されstarted()ます。

つまり(https://stackoverflow.com/a/11039216/368896からコピー):

私の質問は次のとおりです。インスタンスのスロットfinished()を呼び出すために、ワーカー スレッドのイベント ループがシグナルからトリガーを受け取ることを理解しています。また、このイベント ループは、関数が返された直後に実行されるため、関数の最後の呼び出しによってワーカー スレッドのイベント キューに追加されたシグナルからのトリガーを処理する準備が整い、使用可能になります。 .deleteLater()taskdoWork()finished()finished()doWork()

doWork()内部で実行される時間のかかる操作の全過程(発行finished()される前とdoWork()関数が終了する前) の間、ワーカー スレッド内のイベント ループがスロット関数でブロックされていることを確認したいと思いdoWork()ます。したがって、ワーカー スレッドは時間のかかる関数の実行中に、イベント ループのスレッドが所有するオブジェクトでトリガーされたスロットに応答しないでください。(したがって、そのようなスロットは終了後、ワーカー スレッドのイベント ループが再びアクティブになると、シグナルからのトリガーが処理される前にdoWork()のみ実行されます。)doWork()finished()

これは事実だと思いますが、確認したいと思います。

ありがとう!

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

c++ - カスタム グラフィック アイテムが Qt ベースの C++ GUI アプリケーションで常に再描画されるのはなぜですか?

私のアプリケーションには QMdiArea があり、その中に QGraphicsView 派生ビュー (GfxInteractiveView) のインスタンスを含むサブウィンドウが表示され、カスタム QGraphicsItem 派生アイテムを含むシーンを視覚化します。

ここまでは順調ですが、実際に何かを実行する paint() で完全にカスタム化された別のアイテム GfxPointItem もあります。これをシーンに追加すると、すべてのアイテムとしてコアの 1 つで CPU 使用率がフルに跳ね上がります。階層内で、ウィンドウが表示されているかカスタム項目がシーンに存在する限り継続する再描画ループに入ります。これが発生したときにスタックを垣間見ると、どの関数も paint() の呼び出しを担当していないことがわかります。イベントはイベント ループで生成されます。GfxPointItem のコードは次のとおりです。

イベントループがアイテムを再描画し続ける理由がわかりません。私はこれに気付かないでしょうが、標準の QFileDialog::getExistingDirectory() を表示する際に問題が発生しました。これは、グラフィカルアイテムを含むウィンドウが表示されている間はペイントすることさえできません。メインスレッドがそこから離れ、フリーズします。その後、描画関数にトレース ステートメントを追加し、アプリケーションが何もしていないように見える数秒後に、ログファイルに数万のエントリを見つけました。タスク マネージャーでは、ウィンドウが表示されているとき (4 コア プロセッサ上) の CPU 使用率は約 25% であり、ウィンドウを閉じると 0 に低下します。

これらの再描画を強制するコードはありません。イベント ループをデバッグして、アプリケーションの速度を低下させ、フリーズを引き起こすこの動作の原因を見つけるにはどうすればよいですか?

ありがとう!

Qt バージョンは最新の 5.0.2 バイナリ バンドルであり、アプリケーションは x64 用の Visual C++ 2012 でコンパイルされています。

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

node.js - イベントループはnode.jsにどのように実装されていますか?

ノードに 2 つのスレッドがあり、1 つはメイン コードを実行し、もう 1 つはすべてのコールバックを実行する場合、コールバックがリソース/時間を集中的に使用する場合、ブロックが発生する可能性があります。

100,000 人の同時ユーザーがいて、ノード アプリへの各クライアント リクエストが複雑で時間のかかるデータベース クエリを実行するとします (キャッシュが行われないと仮定して)。その後のユーザーは、クエリが返されるのを待っているときにブロックを経験しますか?

各コールバックが独自のスレッドで実行できる場合、これは問題ではありません。しかし、すべてのコールバックが単一の個別の専用スレッドで実行される場合、そのようなシナリオではノードはあまり役に立ちません。

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

c++ - ソケットベースのイベントループ

ソケットに基づいてサーバーとクライアントの通信をセットアップしたいと考えています。クライアントはサーバーに接続して、サーバーからさまざまな通知を受け取ることができます。これは、次のようにクライアント側で実装できます

このコードは、クライアント側の別のスレッドで実行され、サーバーからのさまざまな種類の通知を処理する必要があります。ただし、クライアントはリクエストを送信することでソケットと通信できる必要があります。つまり、

質問:これを達成するにはどうすればよいですか? スレッドの読み取りを中断したくありませんが、特定の要求に対する応答を受け取る必要があります。これは、ローカル ドメイン ストリーム ベースの UNIX ソケットです。

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

node.js - Node.js のシングル スレッドとイベント ループ

まず第一に、私は Node.Js とは何かを理解しようとしているスターターです。2 つの質問があります。

最初の質問Felix の記事
によると、 「同時に起動できるコールバックは 1 つだけです。そのコールバックの実行が完了するまで、他のすべてのコールバックは順番に待機する必要があります」。

次に、次のコードについて検討します(nodejs公式Webサイトからコピー)

2 つのクライアント要求が同時に受信された場合、次のワークフローを意味します。

  1. 最初の http 要求イベントを受信し、2 番目の要求イベントを受信しました。
  2. 最初のイベントが受信されるとすぐに、最初のイベントのコールバック関数が実行されます。
  3. その間、2 番目のイベントのコールバック関数が待機する必要があります。

私は正しいですか?私が正しければ、非常に短い時間内に何千ものクライアント リクエストがある場合、 Node.jsがどのように制御するかということです。

2 番目の質問
「イベント ループ」という用語は、主に Node.js トピックで使用されます。http://www.wisegeek.com/what-is-an-event-loop.htmから「イベントループ」を次のように理解しました。

イベント ループ (またはメイン ループ) は、初期イベントに続くイベントを制御およびディスパッチするプログラム内の構造です。

初期イベントは、キーボードのボタンを押す、プログラムのボタンをクリックするなど、何でもかまいません (Node.js では、初期イベントは http 要求、db クエリ、または I/O ファイル アクセスになると思います)。

これがループと呼ばれるのは、イベントが循環して継続的に発生するためではなく、ループがイベントの準備、イベントのチェック、イベントのディスパッチ、プロセスの最初からやり直しを繰り返すためです。

2番目の段落、特に「プロセスをもう一度繰り返す」というフレーズについて矛盾があります。上記の質問からの上記のhttp.createServerコードは、http 要求イベントを繰り返しリッスンするため、完全に「イベント ループ」であることを受け入れました。

しかし、次のコードをイベント ドリブンかイベント ループかを識別する方法がわかりません。db query が終了した後に起動されるコールバック関数以外は何も繰り返されません。

よろしければ、ご意見とご回答を聞かせてください。

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

javascript - イベント登録とイベントループに関するJavascriptが混乱

イベントとイベントループがどのように機能するかを理解するために長い間試みました。イベント登録とイベント ループに関するインターネットや書籍の記事をたくさん読みましたが、まだそれがどのように機能するのか想像できません。

イベント キューに関する本 Async JavaScript を Prgmatic Bookshelft から読んでいます。この本で記事を読むことができます。

setTimeout を呼び出すと、タイムアウト イベントがキューに入れられます。その後、setTimeout 呼び出しの後のコードが実行され、コードがなくなるまで実行が続けられます。その後、イベント ループが開始され、どのイベントが発生したかが検出され、ハンドラーが呼び出されます。

この記事の後、Javascript のイベントと非同期について少し想像力がつきました。次に、次のコードを自分で試しました。

この文について確認したいので、時間を 0 に設定しました。

setTimeout 呼び出しが実行された後のコードなど。

その後、イベントループが開始され、...

ここまでは、Javascript のイベントで問題ありません。できます。それから、私は Async JavaScript の本を読み続け、以下を読みました:

入力イベントも同じように機能します。ユーザーがクリック ハンドラーがアタッチされた DOM 要素をクリックすると、クリック イベントがキューに入れられます。ただし、現在実行中のすべてのコードが終了するまで、ハンドラーは実行されません。

最初の文は、私には少し混乱しているように聞こえます。例えば:

ここで理解できないのは、コンパイラがクリック イベントをイベント キューに保存するタイミングです。登録後 (このコードの後)、または要素をクリックしたときにキューに保存されますか?

ノードで、イベントがどのように機能するかを理解するために、このコードを試しました。次のコードを検討してください。

ここで期待されるのは次のとおりです。

私はループ
にいます
私はループにいます
私はループにいます 私はループにいます 私はループにいます 私
はループにいます
私はループにいます ev1
にループします

しかし、私が得たのは次のとおりです。

ev1
へ ループ
中 ループ中
ループ中
ループ中
ループ中
ループ
で終了

この出力の後、以前に本やネットの記事で読んだイベント (非同期) の実行とイベント ループに関する私の想像をすべて破ります。本の中の次の文を考えてみましょう。

setTimeout 呼び出しの後のコードが実行され、コードがなくなるまで続きます。その後、イベント ループが開始され、どのイベントが発生したかが検出され、ハンドラーが呼び出されます。

しかし、なぜ上記のコードはEventEmitter逆に動作するのでしょうか? イベントループは最後に実行されると思いました(他のコードが実行された後)。

ノードが非同期のデータベース(マングースなど)クエリについてインターネットで読んだことがあります。非同期データベースクエリがどのように機能するかはわかりませんが、次のように想像しています:

データベースのリクエストとレスポンス

Javascript のイベントが実際にどのように機能するのか、説明してください。