2011-12-20 7 views
1

Qtモデル/ビュー設定で複数のスレッドからアクセスされたデータへのアクセスを同期する方法は?Qt:モデル/ビューのセットアップで、複数のスレッドからのデータへのアクセスを同期する方法は?

私はQTableViewModelクラスを使用しています。

ModelQAbstractTableModelを拡張し(Model::data()によってアクセス)data()コール

マイクラスはネットワークデータをリッスンを通してQTableViewに表示される実際のデータを保持するカスタムクラスNetのインスタンスを有し、別のスレッド上で実行されるからそれはそれのデータを更新します(10文字列の単純固定サイズ配列)。

私のクラスのデータは、常にdata()Modelに呼び出して、それを常に更新するスレッドとQt GUIからアクセスする必要があります。

文字列の配列へのアクセスを同期するためにmutexを使用する必要があると思われますが、QAbstractTableModel::data()constメソッドなので、boost::mutexをロックできません。

QAbstractTableModelに拡張され、データをQTableViewに提供するクラスのデータへの同期の一般的なパターンは何ですか?

答えて

1

私はQtのアイテムビュークラス(QAbstractTableModelのような)と複数のスレッドが一緒にうまくいっているとは思いません。問題は、QAbstractTableModelクラスは、データが変更されるたびに関連するすべてのビュー・クラスに通知することが期待され、ビュー・クラスはいつでもデータ・モデルからデータを読み取ることができると考えていることです。更新とデータが別のスレッドによって所有されている場合は、それを実装することは(効率的に、とにかく)困難です。私はあなたが思いついたマルチスレッドソリューションは、2つのスレッドのうちの1つだけが一度に実行されるように、シリアル化する必要があると思われます。その時点で、あなたは効果的にシングルスレッドプログラムに戻りました。非常に複雑なデザイン:)

私の提案は、可能であれば、代わりにメイン/ Qtスレッドにあなたの10文字のデータベースを移動することです。あなたのネットワーク操作もメインスレッドに移すことができます(QSocketNotifierオブジェクトを使用して、I/Oがすべて非ブロッキングであることを確認して、Qtイベントループを保持できず、GUIパフォーマンスを損なうこともありません)。別のネットワークスレッドでネットワーキングを維持し、ネットワークスレッドがメイン/ Qtスレッドに更新メッセージを送って、メイン/ Qtスレッドにデータベース/テーブルモデルの更新方法を伝えるようにすることもできます。鍵は、メイン/ Qtスレッドがデータモデルのデータベースに対するすべての読み書きを行うことです。

+1

初めてQtのモデル/ビューを使用しようとしたのはマルチスレッドのコードベースであり、 "うーん...ええ、これはうまくいかないようです" http://lists.qt.nokia.com/pipermail/qt-interest/2009-August/011043.html – HostileFork

+0

'Net'クラスは私のビジネスロジックを保持しており、ネットワーキングのためにサードパーティライブラリを使用していますので、Qtから分離する方が好きですモデル(Qtモデル/ビュー設計文書は同様のアプローチを示唆)。データは別のスレッドによって所有されていませんが、別のスレッドからコールバックでアクセスされます。私はちょうど文字列値の読み取り/書き込みのカップルにデータをロックしています、それは今まで働くようです。私は 'Model :: data()'ハンドラのmutexからconstを型キャストして、データを読み込むことができます。 Qtには、かわいい例題で動作するものがたくさんあるようですが、実際のコードには多くのフックアップが必要です。 – stefanB

+0

@HostileFork私はあなたのリンクされた議論を見てきました - 今週私はシンプルなモデル/ビューQtアプリケーションを構築しました(私は通常GUIアプリケーションをしません、私はネットワークの男、ココアを好む/ MacとQt/Linux) 3x10のデータごとに2つのテーブルが表示されます(2つの値は文字列としてフォーマットされます)。このモデルには、他のサードパーティのネットワークライブラリを使用する内部クラスがあり、独自のキューを持っています(自分のスレッドを実行していると仮定しています)。その日、私は毎分4000の完全なテーブル更新x2(2つのソースからの同じデータ)に近く、各メッセージはテーブル内のすべてのアイテムを更新します...これまでのところ私のために働きます。 – stefanB

関連する問題