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

C++ 从聚合线程更新QListView会使GUI卡住,c++,multithreading,qt,C++,Multithreading,Qt,我有这样构建的简单应用程序 主窗口使用QAbstractListModel保持QListView 当我启动应用程序时,我使用线程工作者启动单线程 它的工作是从外部web服务获取数据记录,它在每个web服务上获取10-20条记录 迭代。 现在是有问题的部分: 在从线程工作线程开始的HttpAggregator类中 在迭代每个返回记录的大while循环中 我向另一个名为ViewControler的类发出信号,它的任务填充到QListView模型中 在这一部分中,我的窗口只是冻结,直到在listvie

我有这样构建的简单应用程序
主窗口使用QAbstractListModel保持QListView
当我启动应用程序时,我使用线程工作者启动单线程
它的工作是从外部web服务获取数据记录,它在每个web服务上获取10-20条记录 迭代。
现在是有问题的部分:
在从线程工作线程开始的HttpAggregator类中
在迭代每个返回记录的大while循环中
我向另一个名为ViewControler的类发出信号,它的任务填充到QListView模型中
在这一部分中,我的窗口只是冻结,直到在listview中设置所有项目。 我使用名为“Sleepy”的分析工具进行了检查,并在设置项目的ViewControler方法中使用indid 正在加速减速。
我的问题是,我应该如何正确地做,以便以轻量级的方式添加该项

流程:

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次重绘,而不是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();
    }
}
void LostModel::addItems(QList项)
{
if(items.size())
{
int begin=MyItemList.size();
beginInsertRows(QModelIndex(),begin,begin+items.size()-1);
MyItemList.append(项目);
endInsertRows();
}
}

我尝试使用:void ListModel::addItem(MyItem*pMyItem){beginInsertRows(QModelIndex(),MyItemList.size(),MyItemList.size());MyItemList一次仍然只有一行。尝试较大的块。总共有多少行?检查模型的index()和data()是否快速。可能想尝试一个分析器(例如,如果在unix上,则为callgrind)要查看花费的时间。感谢您的重播,我按照您的示例进行了此操作。添加到列表视图的速度要快很多,但每次使用此方法将所有项目添加到QListView时,我都会有第二次延迟。如何避免这一1秒延迟?如果没有一些分析数据,我无法判断。由于同步,您可能会得到延迟线程的同步?你的开发平台是什么?我在windows xp 32位中工作,你说的线程同步是什么意思?