WMIQuery::wmiquery(WMI::WMITable* table, const QString& query, WMI::ProgressIndicator* progressIndicator)
這是函數簽名。我打電話通過QtConcurrent::run
傳遞QModelIndex交叉線程排隊連接
QFuture<quint32> future = QtConcurrent::run(WMI::WMIQuery::wmiquery, _table, query);
該架構非常簡單。 預期的查詢將返回的行數是已知的。 查詢並行運行,並在每條記錄中取一行加到table: WMI::WMITable*
WMI::WMITable
是一個簡單的QObject表數據結構。 它在行添加時發出rowsAboutToBeInserted(QModelIndex, int, int)
和rowsInserted(QModelIndex, int, int)
。
另一方面ProgressIndicator
在主線程上實例化並且table
傳遞給它的ctor
。它從WMI::WMIQuery::wmiquery()
到ProgressIndicator::setRecordCount(quint64 count)
獲得預期的總行數。 它有一個插槽rowAdded()
,它通過一些簡單的數學運算髮現100的進展。在它的連接器上它連接
connect(_table, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(rowAdded()));
我的想法。作爲WMI::WMIQuery::wmiquery()
我運行在不同的線程上(在QThreadPool
)此連接是一個交叉線程排隊連接。我對麼 ?
我得到以下運行時錯誤
的參數的QObject ::連接:無法排隊類型 'QModelIndex'
(確保 'QModelIndex' 使用qRegisterMetaType註冊()。)
我該怎麼辦?作爲我SLOT(rowAdded())
不需要的SIGNAL(rowsInserted(QModelIndex,int,int))
的3個參數,我應該讓另一個信號像rowInserted()
和發射它,每當我發出rowsInserted(QModelIndex,int,int)
並使用此SIGNAL
作此coinnection
你可能會問,爲什麼我使用的模型一樣喜歡rowsInserted(QModelIndex,int,int)
信號在表數據結構中。因爲我也有一個連接到這個表的模型。這也將逐行更新。不過,我認爲在這方面很重要。
另一種選擇是從發出的信號中刪除'QModelIndex'和兩個'int',因爲它們在槽rowadeded()中都沒有收到。 – djsmith
雅我已經試過這種方式,正如我在問題中提到的那樣。它的工作。 –
以及'qRegisterMetaType(「QModelIndex」)''中額外的開銷是多少?應該解決這個問題嗎?這是一個真正的方式?或一個壞的哈克? –