Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.9.1 - Qt Creator : 4.4.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Une tache de fond dans votre application

Il arrive parfois que certaines instructions de votre application freeze votre application dans quelques temps, ce qui peux parfois donner l'impression d'un plantage. (copie de fichier important, grosse requete de bdd, etc)

Voici un exemple de comment lancer une fonction dans un thread de la maniere la plus simple. Ainsi votre interface ne restera pas figé comme un pingouin :D

Il s'agit ici de la classe QtConcurrent conjugué avec QFutureWatcher
#include <QtGui>

#ifndef QT_NO_CONCURRENT

using namespace QtConcurrent;

const int iterations = 20;

void spin(int &iteration)
{
const int work = 1000 * 1000 * 40;
volatile int v = 0;
for (int j = 0; j < work; ++j)
++v;

qDebug() << "iteration" << iteration << "in thread" << QThread::currentThreadId();
}

int main(int argc, char **argv)
{
QApplication app(argc, argv);

// Prepare the vector.
QVector<int> vector;
for (int i = 0; i < iterations; ++i)
vector.append(i);

// Create a progress dialog.
QProgressDialog dialog;
dialog.setLabelText(QString("Progressing using %1 thread(s)...").arg(QThread::idealThreadCount()));

// Create a QFutureWatcher and connect signals and slots.
QFutureWatcher<void> futureWatcher;
QObject::connect(&futureWatcher, SIGNAL(finished()), &dialog, SLOT(reset()));
QObject::connect(&dialog, SIGNAL(canceled()), &futureWatcher, SLOT(cancel()));
QObject::connect(&futureWatcher, SIGNAL(progressRangeChanged(int,int)), &dialog, SLOT(setRange(int,int)));
QObject::connect(&futureWatcher, SIGNAL(progressValueChanged(int)), &dialog, SLOT(setValue(int)));

// Start the computation.
futureWatcher.setFuture(QtConcurrent::map(vector, spin));

// Display the dialog and start the event loop.
dialog.exec();

futureWatcher.waitForFinished();

// Query the future to check if was canceled.
qDebug() << "Canceled?" << futureWatcher.future().isCanceled();
}

#else

int main()
{
qDebug() << "Qt Concurrent is not yet supported on this platform";
}

#endif
source : http://qt.developpez.com/doc/4.7/qtconcurrent-progressdialog-main-cpp/

Ou encore un lien de quelqu'un qui s'est penché sur la question :
http://www.developpez.net/forums/d1093181/c-cpp/bibliotheques/qt/multithreading/comprendre-qtconcurrent-run/

Il existe bien sur d'autre moyen d'utilisation de thread, cette exemple propose uniquement une façon très simplifier d'utiliser un thread.

Réponses

  • November 2015 modifié
    Bonjour !

    Je viens de tester ce bout de code, mais à la compilation j'ai le message d'erreur suivant :
    erreur : 'QtConcurrent' is not a namespace-name
    Quoi faire ? J'ai beau regarder la documentation mais je ne comprends pas ce qui cloche...
Connectez-vous ou Inscrivez-vous pour répondre.