从聚合线程更新QListView会使GUI卡住

时间:2012-01-05 14:17:57

标签: c++ multithreading qt

我有像这样构建的简单应用程序 Mainwindow使用QAbstractListModel持有QListView 当我启动应用程序时,我使用线程工作者启动单线程 它的工作是从外部Web服务获取数据记录,每个记录获得10-20条记录 迭代。
现在问题部分:
在从线程工作者开始的HttpAggrigator类中 在每个返回记录上迭代的big while循环中 我向另一个调用ViewControler的类发出信号,并将其作业填充到QListView模型中 在这部分中,我的窗口只是冻结,直到列表视图中设置了所有项目。 我检查了名为“Sleepy”的分析工具,并在设置项目的ViewControler方法中进行了检查 缓慢下降 我的问题是我该怎么做才能以轻量方式添加项目

流程:

MainWindow -> start HttpAggrigator (in different thread )
HttpAggrigator -> get records -> start iterate them ( to fill data objects )
HttpAggrigator -> emit signal to ViewControler on each records iteration to build item into MainWindow QListView 

1 个答案:

答案 0 :(得分:1)

每次将项目添加到模型时,都会导致视图重绘自身。您应该将项目聚合到一个列表中,并立即将其插入到模型中。您将有1次重绘而不是n次重绘

一次使用多个项目的方法

void LostModel::addItems(QList<MyItem *> items)
{
    if(items.size())
    {
        int begin = MyItemList.size();

        beginInsertRows(QModelIndex(), begin, begin + items.size() - 1);
        MyItemList.append(items);
        endInsertRows();
    }
}