Qtモデル/ビュー設定で複数のスレッドからアクセスされたデータへのアクセスを同期する方法は?Qt:モデル/ビューのセットアップで、複数のスレッドからのデータへのアクセスを同期する方法は?
私はQTableView
にModel
クラスを使用しています。
Model
はQAbstractTableModel
を拡張し(Model::data()
によってアクセス)data()
コール
マイクラスはネットワークデータをリッスンを通してQTableView
に表示される実際のデータを保持するカスタムクラスNet
のインスタンスを有し、別のスレッド上で実行されるからそれはそれのデータを更新します(10文字列の単純固定サイズ配列)。
私のクラスのデータは、常にdata()
をModel
に呼び出して、それを常に更新するスレッドとQt GUIからアクセスする必要があります。
文字列の配列へのアクセスを同期するためにmutexを使用する必要があると思われますが、QAbstractTableModel::data()
はconst
メソッドなので、boost::mutex
をロックできません。
QAbstractTableModel
に拡張され、データをQTableView
に提供するクラスのデータへの同期の一般的なパターンは何ですか?
初めてQtのモデル/ビューを使用しようとしたのはマルチスレッドのコードベースであり、 "うーん...ええ、これはうまくいかないようです" http://lists.qt.nokia.com/pipermail/qt-interest/2009-August/011043.html – HostileFork
'Net'クラスは私のビジネスロジックを保持しており、ネットワーキングのためにサードパーティライブラリを使用していますので、Qtから分離する方が好きですモデル(Qtモデル/ビュー設計文書は同様のアプローチを示唆)。データは別のスレッドによって所有されていませんが、別のスレッドからコールバックでアクセスされます。私はちょうど文字列値の読み取り/書き込みのカップルにデータをロックしています、それは今まで働くようです。私は 'Model :: data()'ハンドラのmutexからconstを型キャストして、データを読み込むことができます。 Qtには、かわいい例題で動作するものがたくさんあるようですが、実際のコードには多くのフックアップが必要です。 – stefanB
@HostileFork私はあなたのリンクされた議論を見てきました - 今週私はシンプルなモデル/ビューQtアプリケーションを構築しました(私は通常GUIアプリケーションをしません、私はネットワークの男、ココアを好む/ MacとQt/Linux) 3x10のデータごとに2つのテーブルが表示されます(2つの値は文字列としてフォーマットされます)。このモデルには、他のサードパーティのネットワークライブラリを使用する内部クラスがあり、独自のキューを持っています(自分のスレッドを実行していると仮定しています)。その日、私は毎分4000の完全なテーブル更新x2(2つのソースからの同じデータ)に近く、各メッセージはテーブル内のすべてのアイテムを更新します...これまでのところ私のために働きます。 – stefanB