0

私は、使いやすさを支援するためのユーザー インターフェイスを持つように拡張している CLI アプリケーションを持っており、Qt-4.8.3 を使用しています。

アプリケーションは IRC サーバーに接続し、各接続はデータを受信する独自​​のスレッドに存在します。次に、別のスレッドで実行されているパーサーがデータを処理し、それに応じて反応します (チャネルの作成、ユーザーの追加など)。

私はドキュメントを調べてきましたが、自分のインスタンスで UI を更新するための最も便利な方法を判断できません (または実際に見ることはできません)。QThread から継承するクラスを作成して実行する必要があります。 QFuture と QtConcurrent、カスタム構造体を作成し、それを UI スレッドに渡す、customEvent() を使用する、または全体的により良い方法はありますか? コードの読みやすさとパフォーマンスは、最重要要件です。

現時点で私が持っているコードは完全に実行されますが、当然、パーサー スレッド内で新しい QWidget を作成すると、それが UI スレッドではないという通知ですぐに壊れます。

QApplicationでexecを実行するために使用し、サーバー、チャネル、ユーザーなどの作成関数も保持するクラスは1つだけです(現時点では、QObjectを継承し、シグナル+スロット機能を提供します)。

必要に応じてコードを投稿することもできますが、コードがたくさんあり、実際に関連するかどうかはわかりません。

4

2 に答える 2

4

これを行う標準的な方法は、QObject / QThreadペア(または、同じスレッドで複数の関数を実行する場合は、複数のQObjectと単一のQThread)を作成することです。QThreadをサブクラス化する代わりに、QObjectをサブクラス化し、QThreadを作成して、 。を使用してそのスレッドへのQObjectサブクラスインスタンスmoveToThread()。QThreadの使用目的は、コードを実行するコンテナーとしてではなく、オペレーティングシステムのスレッド機能へのインターフェイスとしてです。(http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanationを参照してください)。

もちろん、GUIとのすべての通信は、信号とスロットを使用して行う必要があります。

于 2012-11-11T16:13:13.800 に答える
0

この状況はかなり一般的に聞こえます。これは、UIの更新のために、処理されたデータをスレッドからメインスレッドに転送するための基本的なソリューションにすぎません。

それを行う最も簡単な方法は、SIGNAL/SLOTメカニズムを利用することです。メインスレッドは、パーサーからのシグナルに接続する必要があります。パーサーでデータの準備ができたら、使用するデータ構造で信号を送信するだけです。データ構造は、データを通信するためのニーズに合ったものです。ただの構造体またはあなたが望むものは何でも。

于 2012-11-11T16:13:43.347 に答える