medbsl
medbsl

Reputation: 19

GUI app frozen while process and generate a file

I have a QT GUI application in c++ that aims to process and generates binary files.

The App works fine but it looks like it's frozen when it enters the while loop of processing and writing in the file. I solve this by coping qApp->processEvents(); into the while loop. but the problem is that it takes much more time for generating a file:

Questions:

1- Is there a way to process the data, generate files without being frozen and without the huge delay of the qApp->processEvents();

2- Is it possible to run qApp->processEvents(); in another thread? / OR is there another way to do it?

Upvotes: 0

Views: 66

Answers (1)

Botje
Botje

Reputation: 31010

First, create an object that encapsulates your work:

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();
  }
};

Then create a new thread and have the object do its work there:

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();

The first two connect statements tie the lifetime of the generator to that of the thread, the last two clean up everything once the thread exits.

And you can of course connect to the Generator::progress signal to monitor the generation progress.

Upvotes: 1

Related Questions