首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用来自不同线程的数据实时更新QTableView的最佳策略

使用来自不同线程的数据实时更新QTableView的最佳策略
EN

Stack Overflow用户
提问于 2012-11-28 20:31:56
回答 2查看 4.4K关注 0票数 6

我有应用程序,现在开始几个线程(如5- 10 )收集不同来源的数据。

它们是从主GUI线程中分离出来的,所以我不会感觉到GUI中的任何缓慢,并且我可以在后台线程工作的同时继续工作。一切都很好。

但现在,我希望能够在主图形用户界面中以QTableView格式显示结果。数据是它们的字符串分配,它可以有10,000到100,000个结果,这些结果在QTableView中最多为100,000行。

我的问题是,从线程更新主GUI中的表的最佳方式是什么,以便GUI在更新时不会变慢或空闲。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-28 20:59:39

这就是我要做的:

向工作线程添加一个信号,该信号在每次新的一批数据就绪时发出。使用Qt::QueuedConnection将此信号连接到主GUI线程中定义的插槽。这个槽应该从工作线程收集处理过的数据,并将其插入到表的模型中。模型自然也应该在GUI线程中。

更新1

更详细的解释。您已经获得了线程,所以您所要做的就是稍微扩展一下它们。示例:

代码语言:javascript
复制
// 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.

  • Connect
  1. dataBatchReady()信号到GUI线程的一个插槽。记住要使用Qt::QueuedConnection.
  2. Start threads.
  3. 当执行该插槽时,您需要找出哪个工作线程拥有新数据。您可以将它们全部弹出(效率不是很高),也可以向worker添加额外的方法,以确定dataBatch字段是否为空。您还可以发明其他方法来确定哪个线程发出了信号-这取决于您自己。
  4. 当您确定线程时,只需调用该线程上的popLastBatch()并将返回的列表添加到模型中。模型会处理剩下的事情。如果您仍然有性能问题,请参考tHand的响应。

注意:我没有测试代码,所以它可能包含一些明显的错误。不过,你应该明白这一点。

票数 8
EN

Stack Overflow用户

发布于 2012-11-28 21:32:40

您的性能问题可能与控件在添加每行时执行的操作有关。

例如,参见:QTableView is extremely slow (even for only 3000 rows)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13605141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档