3

Swing を使用して Java でアプリケーションを作成しましたが、現在は C++ で書き直そうとしています。Java のプログラムには、イベントの Model、View、および BlockingQueue への参照を持つ Controller がありました。View で何かが発生すると、新しいイベントが BlockingQueue に入れられ、Controller と Model によって処理されました。次に、SwingUtilities.invokeLater() によって Swing で何らかのアクションが呼び出されました。

Qt を使用して C++ でこのようなことを行うにはどうすればよいですか? モデルを作成しましたが、Java の BlockingQueue などを介して Qt で作成された UI に接続する方法がわかりません。

4

3 に答える 3

1

BlockingQueueに相当するものは、それぞれに固有のものQObjectです。QObjectのQtドキュメントには明示的に記載されていませんが(そうあるべきです!)、すべてのQObjectに対して効果的にイベントキューがあります。staticQCoreApplication::postEventメソッドを使用して、任意のスレッドから任意のQObjectにイベントを投稿できます。QObjectへのポインターがある限り、QObjectにイベントを投稿できます。

このタイプの信号スロット接続は、Qt::QueuedConnection同じイベントキューを使用して内部QMetaCallEventイベントを送信します。これらのイベントはによってピックアップされQObject::event()、関連するスロットへの呼び出しが発生します。制御がスレッドのイベントループに戻ると、スレッドはイベントキューを調べて、イベントをQObject::event()メソッドに渡します。

これらの組み込みのイベントキューは、本質的にQObjectへのアクセスをシリアル化できるため、非常に便利です。したがって、同期プリミティブを追加する必要がなく、デッドロックの設定を回避できます。アドホック同期を使用すると問題が発生しますが、残念ながらJavaでさえ設計上間違っていました。このトピックに関するハーブサッターの優れた公開を参照してください:デッドロックの多くの面とクリティカルセクション内での不明なコードの呼び出しの回避彼はこれと関連するトピックに関する他の多くの出版物を持っています、それは知識の真の宝庫です。彼はまた、優れたパフォーマンスを実現するために、実行から完了までの短くて甘い非同期アプリケーションを設計する方法についても説明しています。

シグナルスロットとイベント投稿を使用してQObjectとそれらの間の接続に基づいて設計を行う場合、プロファイリング/ベンチマークで必要性が示された場合は、これらのQObjectを専用のQThreadに移動する準備ができています。ただし、QWidgetから派生したものは、GUIスレッドを離れることはできません。

于 2012-06-01T19:45:03.353 に答える
1

可能であれば、スレッドの使用を避けます。あなたの側からこれ以上明確にすることなく、シグナルとスロットの Qt ドキュメントを参照することをお勧めします。簡単に言えば、シグナルとスロットは、Qt でのイベント処理のデフォルトの方法です。ウィジェットを操作すると、シグナルがトリガーされます。あなたのクラスは、そのような信号に接続して反応することができます。

この答えは非常に曖昧であることを認識しています。正確に達成したいことについてさらに詳細を追加する場合は、喜んで更新します:)

于 2012-06-01T15:48:51.967 に答える
0

QThreadを使用してワーカークラスを作成したいようです。GUIイベントに応答するスレッドで行われている作業のQt'Mandelbrotの例を見てください:http://doc.qt.io/qt-4.8/qt-threads-mandelbrot-example.html

于 2012-06-01T15:36:55.360 に答える