我需要生成很多QThread
个实例,这些实例会定期处理循环中的某些数据。所以我从QMainWindow
开始。但是,当我开始大约200-300他们,取决于机器,我得到gui冻结一分钟。我不想要这种行为,可以做些什么来避免这种情况?在gui线程中创建一个qthread和class对象是否实用,然后将它们放在一个列表中,然后从QFuture
或QThreadPool
启动它们,类似的东西? :
MyClass * obj = new Myclass(id);
QThread * thread = new QThread();
obj->moveToThread(thread);
connect(obj,SIGNAL(logData(QString)),this,SLOT(dataToListView(QString));
list->append(thread);
taskStartAllThreads * task = new taskStartAllThreads();
task->setProxyList(list);
QThreadPool::globalInstance()->start(task);
// later in QThreadPool task
class taskStartAllThreads : public QObject,public QRunnable
{
Q_OBJECT
public:
void setProxyList(QList<QThread*> * list){
m_threads = list;
}
protected:
void run(){
foreach(QThread* thread,m_threads)
thread->start();
}
signals:
void finished();
private:
QList<QThread*> * m_threads;
};
我不确定这是否是正确的解决方案,有人知道更好的解决方案,以避免gui在很多线程启动时冻结。