我会这样做:
向工作线程添加一个信号,该信号在每次新一批数据准备好时发出。使用 Qt::QueuedConnection 将此信号连接到主 GUI 线程中定义的插槽。这个槽应该从工作线程收集处理过的数据并将其插入到表的模型中。模型自然也应该在 GUI 线程中。
更新 1
更详细的解释。你已经把线程搞定了,所以你所要做的就是稍微扩展它们。例子:
// NOTE:
// In this example I'm assuming that the thread continues to work after
// preparing first batch of data. One thread can prepare multiple batches
// over time. If that's not the case for you then you can probably
// safely ignore mutex stuff and intermediary tmp variables.
class MyWorker : public QThread
{
// ...
public:
void run()
{
while (bWork)
{
QList<MyData> myData;
// Populate 'myData' variable with your data.
// ...
// Now, store myData in more persistent buffer and emit the
// ready signal.
dataBatchMutex.lock();
dataBatch.append(myData);
dataBatchMutex.unlock();
emit dataBatchReady();
}
}
QList<MyData> popLastBatch()
{
QMutexLocker l(&dataBatchMutex);
QList<MyData> tmp = dataBatch;
dataBatch.clear();
return tmp;
}
signals:
void dataBatchReady();
private:
QMutex dataBatchMutex;
QList<MyData> dataBatch;
};
我们有工作线程。现在关于 GUI 线程:
- 创建您的工作线程对象。
- 将信号连接
dataBatchReady()
到 GUI 线程中的插槽。记得使用Qt::QueuedConnection
.
- 启动线程。
- 执行该插槽时,您需要确定哪个工作线程具有新数据。您可以将它们全部弹出(效率不高),或者您可以向工作人员添加其他方法以查明该
dataBatch
字段是否为空。您还可以发明其他方法来确定哪个线程发出了信号 - 这取决于您自己的想法。
- 当您找出线程时,只需调用该
popLastBatch()
线程并将返回的列表添加到模型中。该模型将负责其余的工作。如果您仍有性能问题,请参阅 tHand 的回复。
注意:我没有测试代码,所以它可能包含一些明显的错误。不过,您应该明白这一点。