WMIQuery::wmiquery(WMI::WMITable* table, const QString& query, WMI::ProgressIndicator* progressIndicator)
これは関数シグネチャです。そして私はそれを呼んでいますQtConcurrent::run
QFuture<quint32> future = QtConcurrent::run(WMI::WMIQuery::wmiquery, _table, query);
アーキテクチャは非常に単純です。クエリによって返される予想行数は既知です。クエリは並行して実行され、各レコードフェッチで行が追加され table: WMI::WMITable*
WMI::WMITableます。これはSimple QObject TableDataStructureです。それは放出rowsAboutToBeInserted(QModelIndex, int, int)しrowsInserted(QModelIndex, int, int)、行を追加すると。
一方ProgressIndicator、メインスレッドでインスタンス化され、tableはそのに渡されますctor。からまでの予想される行の総数を取得しWMI::WMIQuery::wmiquery()ますProgressIndicator::setRecordCount(quint64 count)。rowAdded()それはいくつかの簡単な数学をすることによって100から進歩を放出するスロットを持っています。そのctorで接続します
connect(_table, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(rowAdded()));
私が思うこと。別のWMI::WMIQuery::wmiquery()スレッド(上QThreadPool)で実行しているため、この接続はクロススレッドキュー接続です。私は正しいですか?
実行時に次のエラーが発生します
QObject :: connect:タイプ'QModelIndex'の引数をキューに入れることができません
('QModelIndex'がqRegisterMetaType()を使用して登録されていることを確認してください)。
私は何をすべきか ?私SLOT(rowAdded())は3つの引数を必要としないので、次のSIGNAL(rowsInserted(QModelIndex,int,int))ような別の信号を作成rowInserted()し、放出するたびにそれを放出し、代わりにこれをこの結合にrowsInserted(QModelIndex,int,int)使用する必要がありますSIGNAL
rowsInserted(QModelIndex,int,int)テーブルのデータ構造のように、なぜモデルのような信号を使用しているのかと疑問に思われるかもしれません。このテーブルに接続されているモデルもあります。これも行ごとに更新されます。しかし、私はそれがこの点で重要ではないと思います。