問題タブ [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.
c++ - Qt またはその他の言語。イベントループ
私は Qt プラットフォームの C++ プログラマーです。
イベント ループはどのウィジェットにイベント (主にマウス/キーボード イベント) を送信するかをどのように「認識」するのでしょうか? マウス座標と Z オーダーに基づいて実行されますか? キーボードからのイベントはどうですか?
ありがとう
c++ - QTimer->remainingTime() は -1371648957 を返します
Qt 5.3.2 を使用して次のコードを実行すると、残り時間が -1371648957 に設定されます。
その後、ループで残り時間を出力し続けると、負の値が増加するため、発生することtimeout()
はありません。これは本当に意味がありません。
少しコンテキストを与えるために、このコードは別のスレッド内で実行され、QTimer はスレッド化されたオブジェクトのコンストラクターで作成されません。
わかりやすくするために更新されたコードを次に示します。
emit
メインスレッドが受信したことを通知できるため、タイマーの作成が別のスレッドで正しく実行され、スレッド内の Qts イベントループが機能していることを確認しました。
また、このようにタイマーを設定しても違いはありません
秒数を 100000 または 0 に変更すると、アプリケーションを再起動すると残り時間が -1374002988 にわずかに変化しますが、長さは変わりません。
また、ライン上のデバッガーで確認したところtimer->remainingTime()
、内部inter
変数は正しく 100 に設定されています。
これはメモリアドレスかそのようなものでしょうか?
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 を設計するための最良の方法についての意見を探しています。
要約すれば
- イベント ループはアーキテクチャ全体のどこにありますか?
- シグナル/スロットに関して特に考慮すべきことは何ですか?
- 私が説明したものと同様のものを実装する際に、コミュニティが遭遇した落とし穴はありますか?
qt - Qt で QEventLoop で QTimer singleShot を使用する方法
QTimer singleShot を使用して QDialog を開き、ステータス フラグを待つ必要があります。この変数が true の場合、続行します。
これは私のコードです
StatusFlag = FALSE;
NewGUI コンストラクターで StatusFlag が TRUE に設定されている
現在の出力は
期待される出力は
行にコメントすると
QTimer::singleShot(0, this, SLOT(OpenWindow()));
次に、出力は
何か提案はありますか?
qt - QEventLoopの正しい使い方
をどのように使用すればよいか疑問がありますQEventLoop
。2 つのコードがあり、どちらも機能します (Web リソースをダウンロードします)。
最初の1つ:
二つ目:
私が知りたいのは、どれを使うべきかということです。つまり、シグナルが発せられた後、イベントループは2番目のループで終了しますか? それとも、最初のように電話する必要がありquit()
ますか? どこかで 2 番目の解決策を見つけましたが、適切ではないように思われたので、最初のコードに変更しました。
c++ - Qtイベントループが開始される前に私のコードはどのように信号を受信していますか
QProcess waitForFinished() および waitForStarted() 呼び出しが機能する前に、次の Qt 4.8 コードに a.exec() 呼び出しを配置する必要がない理由を理解しようとしています。a.exec() がイベントループを開始することを理解しています。私の考えでは、waitFor* スロットは実行に移る前にシグナル (つまり 'started()' または 'finished()' ) を受信する必要があります。イベントループが開始されていない場合、これはどのように発生しますか?
waitForStarted() のドキュメント:
コード:
timeout - QTimer が起動しない (トリガー) タイムアウト
Qtimer を使用して、特定のコード ブロックの実行を一時停止し、別のスレッドで別の処理を実行したいと考えています。qeventloop quit でスレッドのタイムアウトを接続しましたが、問題はタイムアウトが呼び出されないことです。別のエミットが発生すると、タイムアウトが魔法のようにトリガーされるか、別の接続を追加するとタイムアウトもトリガーされます。qtimer、qeventloop、qthread の使用について、何かが欠けていると思います。誰でも助けることができますか?テスト用に基本的なコードを抽出し、ここに配置しました。
main.cpp
tim.h
ティム.cpp
//widget.h をテストするための GUI
ウィジェット.cpp
c++ - QMessageBox .gif ファイルが表示されない
私は、アイコンの代わりに、このダイアログにQMessageBox
アニメーション GIF を配置しました。しかし、gifには問題があります。画面を更新すると何とか機能しますが、gifはもう表示されません。QLabel
QMovie
QMessageBox
c++ - スロットで QDialog::exec を呼び出すと、メイン イベント ループがブロックされますか?
Qt アプリケーションのメイン ウィンドウは通常のQMainWindow
サブクラスです。そのウィンドウにはいくつかのボタンがあります。それぞれにclicked
独自のスロットに接続された信号があり、各スロットは次のQDialog
ように異なるものを作成します。
私はこの記事を読んでいます: https://wiki.qt.io/Threads_Events_QObjects#Events_and_the_event_loopと著者は言います
イベントループを決してブロックしないでください
それは私を心配させました。exec
はブロッキング関数であるため、彼がそこで言っていることによると (彼の例でWorker::doWork
は多くの作業が行われ、完了するまでに時間がかかります)、私のコードはイベント ループをブロックしていますが、これを示唆するものは何も気づいていません。それどころか、メインウィンドウは正常に動作しているようで、メソッドを使用するようにコードを変更しても違いはありませんでしたshow()
。
イベントループをブロックしていますか? ここで別のアプローチを使用する必要がありますか?