Un QThread avec boucle infinie
Bonjour,
J'aimerais savoir quelle serait le code pour faire en sorte qu'une QProgressBar puisse s'activer (valeur modifiée) pendant qu'une autre tâche s'effectue dans le main (une tâche assez longue) ?
Il faudrait que l'application soit ne soit pas "freezé" (le but des QThreads), mais quand j'enlève le "QCoreApplication::processEvents();", mon application se freeze...
Voici le code (que je pense est incorrecte quelque part car je n'ai jamais utilisé QThread et je n'ai pas trouvé de documentation appropriée dans mon cas à part des forums) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| #ifndef DEF_Q_S_THREAD_HPP
#define DEF_Q_S_THREAD_HPP
#include <QApplication>
#include <QCoreApplication>
#include <QThread>
#include <QWaitCondition>
class QSThread : public QThread
{
Q_OBJECT
public:
// Constructeur/Destructeur
QSThread(QObject *parent = 0);
~QSThread();
// -----------------------------------------------------------------------------------------------------------------
// Méthode de lancement
void run();
private:
// Attributs privés
int m_value;
QWaitCondition m_wait_condition;
signals:
// Signal qui modifie la progression de la progressBar
void setValue(int value);
};
#endif //DEF_Q_S_THREAD_HPP |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #include "QSThread.hpp"
// Constructeur
QSThread::QSThread(QObject *parent) : QThread(parent)
{
// initialisation de l'attribut m_valeur
m_value = 0;
}
// Destructeur
QSThread::~QSThread()
{}
// -------------------------------------------------------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------------------------------------------
// Méthode de lancement
void QSThread::run()
{
while(1)
{
m_value += 5;
//m_mutex.unlock();
// vérification de la nouvelle valeur
if(m_value >= 100)
m_value = 0;
// changement de valeur
emit setValue(m_value);
QCoreApplication::processEvents();
m_wait_condition.wait();
}
} |
et voici la progressBar :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #ifndef DEF_Q_S_PROGRESS_BAR_HPP
#define DEF_Q_S_PROGRESS_BAR_HPP
#include <QProgressBar>
#include "QSThread.hpp"
class QSProgressBar : public QProgressBar
{
Q_OBJECT
public:
// Constructeur/Destructeur
QSProgressBar(QWidget *parent = 0);
~QSProgressBar();
// -----------------------------------------------------------------------------------------------------------------
// Méthodes de lancement de chargement
void startLoading();
void stopLoading();
private:
// Thread principale
QSThread m_thread;
};
#endif //DEF_Q_S_PROGRESS_BAR_HPP |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| #include "QSProgressBar.hpp"
// Constructeur
QSProgressBar::QSProgressBar(QWidget *parent) : QProgressBar(parent)
{
// configuration de la progressBar
setValue(0);
setTextVisible(false);
// connexion des signaux
connect(&m_thread, SIGNAL(setValue(int)), this, SLOT(setValue(int)));
}
// Destructeur
QSProgressBar::~QSProgressBar()
{}
// -------------------------------------------------------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------------------------------------------------------
// Met en route le chargement
void QSProgressBar::startLoading()
{
m_thread.start(QThread::HighestPriority );
}
// Stoppe le chargement
void QSProgressBar::stopLoading()
{
m_thread.exit();
setValue(0);
} |