問題タブ [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 投票する
2 に答える
145 参照

c++ - Qt またはその他の言語。イベントループ

私は Qt プラットフォームの C++ プログラマーです。

イベント ループはどのウィジェットにイベント (主にマウス/キーボード イベント) を送信するかをどのように「認識」するのでしょうか? マウス座標と Z オーダーに基づいて実行されますか? キーボードからのイベントはどうですか?

ありがとう

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

c++ - QTimer->remainingTime() は -1371648957 を返します

Qt 5.3.2 を使用して次のコードを実行すると、残り時間が -1371648957 に設定されます。

その後、ループで残り時間を出力し続けると、負の値が増加するため、発生することtimeout()はありません。これは本当に意味がありません。

少しコンテキストを与えるために、このコードは別のスレッド内で実行され、QTimer はスレッド化されたオブジェクトのコンストラクターで作成されません。

わかりやすくするために更新されたコードを次に示します。

emitメインスレッドが受信したことを通知できるため、タイマーの作成が別のスレッドで正しく実行され、スレッド内の Qts イベントループが機能していることを確認しました。

また、このようにタイマーを設定しても違いはありません

秒数を 100000 または 0 に変更すると、アプリケーションを再起動すると残り時間が -1374002988 にわずかに変化しますが、長さは変わりません。

また、ライン上のデバッガーで確認したところtimer->remainingTime()、内部inter変数は正しく 100 に設定されています。

これはメモリアドレスかそのようなものでしょうか?

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

qt - Qt: マルチスレッド DLL 設計

はじめ に これは自由回答式の質問ですが、これに関する優れたドキュメントを見つけることができなかったため、コミュニティにとって有益であると考えました。残念ながら、後で説明するように、Qt での DLL の実装は他の言語とは異なるという難しい方法を学びました。

問題文 Qt 以外のアプリケーションで簡単に使用できるマルチスレッド DLL を Qt に実装する

背景情報

Qt は、固有のクロスプラットフォーム互換性があるため、最適なツールです API はコールバック関数を使用して、特定のイベントが発生したときに呼び出し元のアプリケーションに通知します

仮定

-Qt dll にリンクするアプリケーションは、Qt コンパイラ (c/c++ -mingw、C# -msvc) と互換性があります。ワーカー スレッドからメイン スレッドに戻るだけでなく (たとえば、データ収集が完了したことをコールバック関数を介してメイン スレッドに通知する)

問題の説明

Qt のアーキテクチャが原因で、QT でマルチスレッド DLL を作成することが他の言語とは異なるという難しい方法を学びました。spwaning スレッド、タイマー、シグナルの送信、およびスロットの受信を処理する QT イベント ループが原因で、問題が発生します。この Qt 偶数ループ (QApplication.exec()) は、メイン アプリが Qt の場合 (Qt が QT 固有のライブラリにアクセスできる場合)、メイン アプリケーションから呼び出すことができます。ただし、呼び出し元のアプリケーションが Qt ではない場合、たとえば C# の場合、呼び出し元のアプリケーション (別名メイン スレッド) には Qt 固有のライブラリを呼び出す機能がないため、イベント ループが埋め込まれた DLL を設計する必要があります。 . QApplication.exec がブロックされているため、後で押し込むのは難しいため、これを設計の前もって考慮することが重要です。

一言で言えば、Qt 以外のアプリケーションと互換性があるように、Qt でマルチスレッド dll を設計するための最良の方法についての意見を探しています。

要約すれば

  • イベント ループはアーキテクチャ全体のどこにありますか?
  • シグナル/スロットに関して特に考慮すべきことは何ですか?
  • 私が説明したものと同様のものを実装する際に、コミュニティが遭遇した落とし穴はありますか?
0 投票する
1 に答える
3282 参照

qt - Qt で QEventLoop で QTimer singleShot を使用する方法

QTimer singleShot を使用して QDialog を開き、ステータス フラグを待つ必要があります。この変数が true の場合、続行します。

これは私のコードです

StatusFlag = FALSE;

NewGUI コンストラクターで StatusFlag が TRUE に設定されている

現在の出力は

期待される出力は

行にコメントすると

QTimer::singleShot(0, this, SLOT(OpenWindow()));

次に、出力は

何か提案はありますか?

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

qt - QEventLoopの正しい使い方

をどのように使用すればよいか疑問がありますQEventLoop。2 つのコードがあり、どちらも機能します (Web リソースをダウンロードします)。

最初の1つ:

二つ目:

私が知りたいのは、どれを使うべきかということです。つまり、シグナルが発せられた後、イベントループは2番目のループで終了しますか? それとも、最初のように電話する必要がありquit()ますか? どこかで 2 番目の解決策を見つけましたが、適切ではないように思われたので、最初のコードに変更しました。

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

c++ - Qtイベントループが開始される前に私のコードはどのように信号を受信して​​いますか

QProcess waitForFinished() および waitForStarted() 呼び出しが機能する前に、次の Qt 4.8 コードに a.exec() 呼び出しを配置する必要がない理由を理解しようとしています。a.exec() がイベントループを開始することを理解しています。私の考えでは、waitFor* スロットは実行に移る前にシグナル (つまり 'started()' または 'finished()' ) を受信する必要があります。イベントループが開始されていない場合、これはどのように発生しますか?

waitForStarted() のドキュメント:

コード:

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

timeout - QTimer が起動しない (トリガー) タイムアウト

Qtimer を使用して、特定のコード ブロックの実行を一時停止し、別のスレッドで別の処理を実行したいと考えています。qeventloop quit でスレッドのタイムアウトを接続しましたが、問題はタイムアウトが呼び出されないことです。別のエミットが発生すると、タイムアウトが魔法のようにトリガーされるか、別の接続を追加するとタイムアウトもトリガーされます。qtimer、qeventloop、qthread の使用について、何かが欠けていると思います。誰でも助けることができますか?テスト用に基本的なコードを抽出し、ここに配置しました。

main.cpp

tim.h

ティム.cpp

//widget.h をテストするための GUI

ウィジェット.cpp

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

c++ - QMessageBox .gif ファイルが表示されない

私は、アイコンの代わりに、このダイアログにQMessageBoxアニメーション GIF を配置しました。しかし、gifには問題があります。画面を更新すると何とか機能しますが、gifはもう表示されません。QLabelQMovieQMessageBox

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

c++ - スロットで QDialog::exec を呼び出すと、メイン イベント ループがブロックされますか?

Qt アプリケーションのメイン ウィンドウは通常のQMainWindowサブクラスです。そのウィンドウにはいくつかのボタンがあります。それぞれにclicked独自のスロットに接続された信号があり、各スロットは次のQDialogように異なるものを作成します。

私はこの記事を読んでいます: https://wiki.qt.io/Threads_Events_QObjects#Events_and_the_event_loopと著者は言います

イベントループを決してブロックしないでください

それは私を心配させました。execはブロッキング関数であるため、彼がそこで言っていることによると (彼の例でWorker::doWorkは多くの作業が行われ、完了するまでに時間がかかります)、私のコードはイベント ループをブロックしていますが、これを示唆するものは何も気づいていません。それどころか、メインウィンドウは正常に動作しているようで、メソッドを使用するようにコードを変更しても違いはありませんでしたshow()

イベントループをブロックしていますか? ここで別のアプローチを使用する必要がありますか?