c++ qt5.8版本 QGraphicsScene 中一次性添加10万个QGraphicsItem,如何不卡顿,是否可以使用线程池
时间: 2024-01-24 22:40:32 浏览: 123
线程池c++,通过线程控制实现线程集动态调整线程个数
在一次性添加大量QGraphicsItem时,可能会导致UI卡顿或者崩溃。为了解决这个问题,可以考虑使用线程池。
首先,将QGraphicsItem的创建过程放到一个单独的线程中去执行。其次,在主线程中,创建一个QRunnable的线程池,并将QGraphicsItem的创建任务分配到线程池中的线程中去执行。
具体实现如下:
1. 创建QGraphicsItem的任务
```c++
class CreateItemTask : public QObject, public QRunnable {
Q_OBJECT
public:
CreateItemTask(QGraphicsScene* scene, int count) : m_scene(scene), m_count(count) {}
void run() {
for (int i = 0; i < m_count; i++) {
QGraphicsItem* item = new QGraphicsItem;
// 设置item的位置和属性等
QMetaObject::invokeMethod(m_scene, "addItem", Qt::QueuedConnection, Q_ARG(QGraphicsItem*, item));
}
}
private:
QGraphicsScene* m_scene;
int m_count;
};
```
2. 将任务添加到线程池中进行执行
```c++
QThreadPool* threadPool = QThreadPool::globalInstance();
threadPool->setMaxThreadCount(4); // 设置线程池中的线程数
int itemCount = 100000;
int taskCount = 4; // 将任务分成4个部分
int countPerTask = itemCount / taskCount;
for (int i = 0; i < taskCount; i++) {
CreateItemTask* task = new CreateItemTask(scene, countPerTask);
threadPool->start(task);
}
```
在执行以上代码时,QGraphicsItem的创建任务会被分配到线程池中的4个线程中去执行,从而避免了主线程卡顿或者崩溃的问题。
阅读全文