我有应用程序,现在开始几个线程(如5- 10 )收集不同来源的数据。
它们是从主GUI线程中分离出来的,所以我不会感觉到GUI中的任何缓慢,并且我可以在后台线程工作的同时继续工作。一切都很好。
但现在,我希望能够在主图形用户界面中以QTableView格式显示结果。数据是它们的字符串分配,它可以有10,000到100,000个结果,这些结果在QTableView中最多为100,000行。
我的问题是,从线程更新主GUI中的表的最佳方式是什么,以便GUI在更新时不会变慢或空闲。
发布于 2012-11-28 20:59:39
这就是我要做的:
向工作线程添加一个信号,该信号在每次新的一批数据就绪时发出。使用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线程:
创建你的工作线程objects.
dataBatchReady()信号到GUI线程的一个插槽。记住要使用Qt::QueuedConnection.dataBatch字段是否为空。您还可以发明其他方法来确定哪个线程发出了信号-这取决于您自己。popLastBatch()并将返回的列表添加到模型中。模型会处理剩下的事情。如果您仍然有性能问题,请参考tHand的响应。注意:我没有测试代码,所以它可能包含一些明显的错误。不过,你应该明白这一点。
发布于 2012-11-28 21:32:40
您的性能问题可能与控件在添加每行时执行的操作有关。
例如,参见:QTableView is extremely slow (even for only 3000 rows)
https://stackoverflow.com/questions/13605141
复制相似问题