問題タブ [qeventloop]

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 に答える
284 参照

events - pyside - イベント ループ内のすべてのイベントのログ情報を取得する方法はありますか?

私は PySide を使用してアプリケーションを開発していますが、どのイベントがメイン イベント ループに入り、どのイベントが出るかをログに記録する方法があるかどうか疑問に思っていました。私のアプリケーションはスレッドを使用しません。完全に非同期ですが、デバッグ目的でイベントループのログレジストリが必要でした。logging私はログ機能として使用しています(当然)。

Pax et bonum。

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

c++ - スロットへのいくつかの QTimers 呼び出しをキューに入れる

私は、いくつかの処理を開始する (ジョブを実行するスレッドを開始する) トリガー関数を呼び出す必要があるライブラリを使用しており、すぐに戻ります。その後、処理が終了すると、シグナルが発行されます。

これは、さまざまなパラメータに基づいて定期的に行う必要があります。処理中にトリガー関数への他の呼び出しを実行してはならないため、何らかの方法でそれらをキューに入れる必要があります。QEventLoop (「ループ」) を使用することを考えましたが、今のところ運がありません。

このコードを見てください:

問題は、処理中に loop.exec() が呼び出されると、次のメッセージが表示されることです。

私が意図したことを行う正しい方法は何ですか?

前もって感謝します。

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

c++ - QThread、QObject、スレッド アフィニティ、およびイベント ループに関する混乱

私はリンクをたどっていました

  1. それは間違っている
  2. QThread の正しい使い方 Part1
  3. QThread の正しい使い方 Part2

いくつかのステートメントに混乱しました。最初のリンクでは、

QThread のすべての関数は、QThread が開始するスレッドではなく、作成中のスレッドから呼び出されるように記述され、意図されています。

moveToThreadサブクラス化する代わりに、オブジェクトを新しいスレッドに移動するために使用することを提案していますQThread。私の質問は:

イベント ループを作成するrunメソッド呼び出しのデフォルトの実装と、オブジェクトのスレッド アフィニティが を使用して変更されると、すべてが作成スレッドではなく新しいスレッドで実行されます。これは、前述の使用目的と矛盾します。何か不足していますか?execmoveToThreadslots

2 番目の質問:

3番目のリンクでは、

イベント キューはイベント ループではなくスレッドに属し、このスレッドで実行されているすべてのイベント ループによって共有されます。

私の質問は、1 つのスレッドに複数のイベント ループが存在する方法です。私が理解しているのは、/が呼び出されるまでevent -loopがevent-queueをループし、各プロセスがそのキューに到着することです。これが真の場合、( /が呼び出されない限り) 1 つのループが終了することはありません。別のループを開始するにはどうすればよいでしょうか? それを示すサンプルコードは高く評価されます。exitterminateeventexitterminate

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

c++ - メインスレッドをブロックせずに Qt-Dbus バインディングを使用する方法

私の目標は、Qt の DBus バインディングを使用してライブラリを作成することです。

メインスレッドで (クラスQEventLoopによって提供される)を起動せずに Qt アプリケーションを作成しようとしました。QCoreApplication

これは最小限のアプリケーション サンプルです。QT-4.6.2 バージョンを使用すると正常に動作しますが、QT-4.8 以降を使用するとイントロスペクションがブロックされます。

DBusHandler.hpp

main.cpp

main.cppファイルでわかるように、app.exec()はコメント アウトされていますが、アプリケーションは QT-4.8 以降のバージョン (5.3.0) で正常に動作します。

私の質問は次のとおりです: Qt-4.8 または 5.3 で、メインスレッドapp.exec()以外のスレッドで呼び出す Qt の DBus バインディングを使用することは可能ですか?

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

c++ - ループ内での QThread の処理と削除

次のような for ループで実行されている QThread (ClassA と呼ばれる) から継承されたクラスがあります。

問題は、classa に多くのメモリが含まれており、ループがまだ実行されている間は破棄されていないように見えることです。そのため、メモリが蓄積されるとすぐにプログラムがクラッシュします (メモリ リークなど)。もちろん、プログラムをクラッシュさせる「delete classa」も使用しようとしました。

そのようなクラスをループで適切に実行および削除する方法を誰もが知っているので、メモリを常に占有することはありません。

for ループも別のスレッドにあります。では、deleteLater() を呼び出す際にイベント ループが重要になる可能性があるスレッド階層はありますか? コードは少し複雑すぎて書くことができませんが、私が望む最も迅速な答えは、スレッド環境で Qthread オブジェクトを適切に削除する方法 (つまり、eventloop を適切に使用する方法) であり、メモリ リーク (またはメモリがQthread オブジェクトは削除されません)

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

c++ - Qt: QEventLoop::exec を呼び出した後のデッドロック

QEventLoop::exec を呼び出すと、特定の条件下でデッドロックするように見えるかなり単純なアプリケーションがあります。アプリケーションは、次の 2 つのシナリオでこの関数を呼び出します。

  • 特定のデータがソケットに到着したとき
  • タイマーイベント時

どちらの場合も、次のコンテキストで使用されます (単なる http クエリで、特別なことは何もありません)。

これを呼び出そうとすると、次のようになります。

ご覧のとおり、HTTP 要求の応答を待つ代わりに、別のイベントを取得して処理を開始しました。その結果、アプリケーションが停止する前に現在のスレッドで膨大な数のフレーム (746) を取得し、次のような行が表示されます。

ここで何が間違っているのか、誰か親切に説明してもらえますか?

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

c++ - Qtは、他のスレッドからイベントループへの関数呼び出しを追加します

現在、エレガントな方法では解決できない問題に出くわしました。状況: アプリケーションの外部から呼び出されるコールバック関数があります。repaint()コールバック関数は、いくつかの gui オブジェクトを更新する必要があります。別のスレッド内から(たとえば) 呼び出すことができないため、メイン イベント ループに関数呼び出しを追加して、タスクがいつか実行されるようにする方法を見つける必要があります。 .

考えられる方法の 1 つは、これを使用することです。

ただし、これはno such Method "Object::functionName". (これは明らかに嘘です!)

また、接続タイプを に設定して、イベント ループから呼び出されるスロットに信号を接続することについても読みましたQt::QueuedConnection。ただし、QOjbect.:connect()信号を取得する必要があるオブジェクトがわからないため、使用は機能しません。ニースは次のようなものになります

QObject::emit(object, SIGNAL(function(flaot)), arg);

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

qt - タイマーを手動で再起動した後の文書化されていない奇妙な QTimer/QEventLoop の動作

内部QEventLoopで関数を呼び出すQTimerを使用しているときに、最近これに遭遇しました

QTimer インスタンスがあるとします。

コンストラクターのどこかでそれを開始すると、100msごとに1回刻み始めます

楽しい部分です。内部 QEventLoop を持つスロットに接続します。

このループがいかに馬鹿げているかはさておき、スロットの処理を終了することはなく、タイマーの後続のタイムアウトが実行キューにスタックし続けることがわかります。すべてが順調で、あるべき姿です。

本来あるべきでないことは次のとおりです。QEventLoop は、スロットが無意識にアイドル状態になっている間もアプリの応答性を維持するため、次のようなボタンとその clicked() スロットを作成できます。

ここで行っていることは、基本的に現在のタイマー サイクルを再起動することであり、それ以下でもそれ以上でもありません。右?いいえ!この再起動後、SlotFunction は再び起動し、タイマーの再起動後のティックが実際にはそれ以前に発行された他のすべてのティックと等しくないことを示唆しています...

私の唯一の質問は: WTF ?! タイマーを手動で再起動すると、スロットの追加時間を入力できるようになるのはなぜですか? freenodeで聞いてみたのですが、「あるべき姿です」という返事しか返ってきませんでした。

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

c++ - QApplication::exec() を呼び出さずにローカル イベント ループを作成することは可能ですか?

関数にイベントループを持たないプログラムの上QTcpServerに構築されたライブラリを作成したいと思います (Qt イベントループがブロックされており、必要なリアルタイム操作に十分なタイミング解像度が提供されないため) )。QTcpSocketmain

クラス内にローカル イベント ループを作成することでこれを回避したいと考えていましたがapp->exec()、最初にメイン関数を呼び出さない限り機能しないようです。アプリケーション レベルのイベント ループを使用せずに、ローカル イベント ループを作成し、スレッド内でシグナル/スロット通信を可能にする方法はありますか?

私はすでに見ましたQApplication::exec() なしで Qt を使用する方法はありますか? しかし、ソリューションはローカル イベント ループを追加するように見えますが、アプリケーション ループは削除しないため、答えは役に立ちません。