我的应用程序现在启动几个线程(如 5-10 个)来从不同源收集数据。
它们与主 GUI 线程分离,因此我在 GUI 中感觉不到任何缓慢,并且我可以在后台线程工作时继续工作。一切都很棒。
但现在我希望能够在我的主 GUI 中的 QTableView 中显示结果。数据是它们的字符串分配,它可以有 10,000 到 100,000 个结果,在 QTableView 中应该最多有 100,000 行。
我的问题是从线程更新主 GUI 中的表的最佳方法是什么,这样 TH GUI 在更新时不会变慢或空闲。
我就是这样做的:
向工作线程添加一个信号,每次新一批数据准备就绪时都会发出该信号。使用 Qt::QueuedConnection 将此信号连接到主 GUI 线程中定义的槽。该槽应从工作线程收集处理后的数据并将其插入表的模型中。模型自然也应该在 GUI 线程中。
Update 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 的回复。
Note:我没有测试代码,因此它可能包含一些明显的错误。不过,你应该明白了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)