GUI应用程序在处理和生成文件时被冻结



我在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信号来监控生成进度。

最新更新