我在c++中有一个QT GUI应用程序,旨在处理和生成二进制文件。
该应用程序运行良好,但当它进入处理和写入文件的while循环时,它看起来像是被冻结了。我通过将qApp->processEvents();
处理到while循环中来解决此问题。但问题是生成一个文件需要更多的时间:
-
循环中没有
qApp->processEvents();
=>需要4秒 -
其中循环中的CCD_ 3=>完全相同的文件需要50秒
for (unsigned long int k=0; k<DATASIZE ; k++){ qApp->processEvents(); /* Some process*/ DataToFile.push_back(Process_Function(DATA)); } /*Generating file*/ myFile.write((char *)&DataToFile[0], DataToFile.size()*sizeof (float));
-
数据大小约为几百万
-
Process_Function:获取特定数据,计算出值并返回。
问题:
1-有没有一种方法可以处理数据,生成文件而不会被冻结,也不会有qApp->processEvents();
的巨大延迟
2-是否可以在另一个线程中运行qApp->processEvents();
?/或者有其他方法吗?
首先,创建一个封装您的工作的对象:
class Generator : public QObject {
Q_OBJECT
signals:
void progress(float);
void done();
slots:
void doWork() {
QVector<float> DataToFile;
for (unsigned long int k=0; k<DATASIZE ; k++){
/* Some process*/
DataToFile.push_back(Process_Function(DATA));
if (k % 100 == 0) { // Inform the UI thread every 100 datapoints
emit progress(k/DATASIZE);
}
}
myFile.write((char *)&DataToFile[0], DataToFile.size()*sizeof (float));
emit done();
}
};
然后创建一个新线程,让对象在那里工作:
QThread *t = new QThread(this);
Generator *g = new Generator;
g->moveToThread(t);
QObject::connect(t, &QThread::started, g, &Generator::doWork);
QObject::connect(g, &Generator::done, t, &QThread::quit);
QObject::connect(t, &QThread::finished, g, &QObject::deleteLater);
QObject::connect(t, &QThread::finished, t, &QThread::deleteLater);
t->start();
前两个connect
语句将生成器的生存期与线程的生存期联系起来,后两个语句在线程退出后清除所有内容。
当然,您可以连接到Generator::progress
信号来监控生成进度。