1

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

私はクラスで使用QTableViewしています。Model

Model拡張し、呼び出しを通じて表示される実際のデータを保持QAbstractTableModelするカスタムクラスのインスタンスがあります(によってアクセスされます)NetQTableViewdata()Model::data()

私のクラスはネットワークデータをリッスンし、データを更新する別のスレッドで実行されます(10文字列の単純な固定サイズの配列)。

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

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

データを拡張QAbstractTableModelして提供するクラスのデータへのアクセスを同期するための一般的なパターンは何QTableViewですか?

4

1 に答える 1

1

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

可能であれば、代わりに10文字のデータベースをメイン/Qtスレッドに移動することをお勧めします。ネットワーク操作をメインスレッドに移動することもできます(QSocketNotifierオブジェクトを使用し、I / Oがすべて非ブロッキングであることを確認して、Qtイベントループを阻止してGUIのパフォーマンスを低下させないようにします)。または、ネットワークを別のネットワークスレッドに保持し、ネットワークスレッドに更新メッセージをメイン/ Qtスレッドに送信させて、データベース/テーブルモデルを更新する方法をメイン/Qtスレッドに通知することもできます。重要なのは、メイン/Qtスレッドによってデータモデルのデータベースへのすべての読み取りと書き込みが行われるようにすることです。

于 2011-12-20T06:44:08.323 に答える