从不同线程实时更新QTableView数据的最佳策略

时间:2012-11-28 12:31:56

标签: c++ multithreading qtableview ui-thread

我有应用程序,现在开始几个线程(如5 - 10)从不同的来源收集数据 它们与主GUI线程分离,因此我感觉GUI中没有任何缓慢,我可以在后台线程工作时继续工作。一切都很棒 但现在我希望能够在主GUI中的QTableView中显示结果。数据是它们的字符串,它可以有10,000到100,000个结果,在QTableView中可能有多达100,000行。

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

2 个答案:

答案 0 :(得分:7)

我就是这样做的:

向每次准备新批数据时发出的工作线程添加信号。使用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线程:

  1. 创建工作线程对象。
  2. dataBatchReady()信号连接到GUI线程中的插槽。请务必使用Qt::QueuedConnection
  3. 启动主题。
  4. 执行该插槽时,您需要确定哪个工作线程具有新数据。您可以将它们全部弹出(效率不高),也可以向工作人员添加其他方法,以查明dataBatch字段是否为空。您还可以发明其他方法来确定哪个线程发出信号 - 这取决于您要弄明白。
  5. 找出线程时,只需调用该线程上的popLastBatch()并将返回的列表添加到模型中。该模型将负责其余部分。如果您仍然遇到性能问题,请参阅tHand的回复。
  6. 注意:我没有测试代码,因此可能包含一些明显的错误。不过,你应该明白这一点。

答案 1 :(得分:0)

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

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