我有应用程序,现在开始几个线程(如5 - 10)从不同的来源收集数据 它们与主GUI线程分离,因此我感觉GUI中没有任何缓慢,我可以在后台线程工作时继续工作。一切都很棒 但现在我希望能够在主GUI中的QTableView中显示结果。数据是它们的字符串,它可以有10,000到100,000个结果,在QTableView中可能有多达100,000行。
我的问题是从线程更新主GUI中的表的最佳方法是什么,以便在更新时TH GUI不会变慢或空闲。
答案 0 :(得分:7)
我就是这样做的:
向每次准备新批数据时发出的工作线程添加信号。使用Qt :: QueuedConnection将此信号连接到主GUI线程中定义的插槽。此插槽应从工作线程收集已处理的数据并将其插入表的模型中。模型应该自然也在GUI线程中。
更详细的解释。你已经把线程缩小了所以你所要做的就是将它们扩展一点。例如:
// 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的回复。注意:我没有测试代码,因此可能包含一些明显的错误。不过,你应该明白这一点。
答案 1 :(得分:0)
您的性能问题可能与控件在添加每行时执行的操作有关。