Bonjour,

Je lance plusieurs threads en parallèle qui travaillent à partir d'une liste. Cette liste est protégée par un QMutex, mais malgré cela mes quatre threads traitent la même première occurrence et ne vident pas la liste.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Thread : public QThread
{
	Q_OBJECT
public:
	Thread(QStringList&, int);
 
 
protected:
	void run();
 
private:
	QStringList Liste;
	int num_thread;
	volatile bool stopped;
	QMutex mutexListe;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Thread::Thread(QStringList & list, int i)
{
  stopped = false;
  Liste = list;
  num_thread = i;
}
 
void Thread::run()
{
	qDebug() << "Thread " << num_thread;
 
  forever {
    mutexListe.lock();
    int nb;
    if (!Liste.isEmpty()) {
       QString jobname(Liste.first());
       Liste.removeFirst();
       nb = Liste.size();
       mutexListe.unlock();
       //Mon code QProcess
       qDebug() << "Taille liste = " << nb << "  sur " << num_thread;
       qDebug() << "Lancement " << jobname << " sur " << num_thread;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 #include <QApplication>
 
 #include "Thread.h"
 
 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);
 
  int noeuds(4);
  QStringList Liste;
  Liste << "SCD1LoadDimSSKsFromDimAndFact" << "SCD1LoadFactSSKs" << "SCD1LoadTargetTable" << "SCD1Lookups1" << "SCD1Lookups10" << "SCD1Lookups2";
 
  for (int i(0) ; i < noeuds ; ++i)
  {
  	Thread * un_thread;
  	un_thread = new Thread(Liste, i);
  	un_thread->start();
  }  
 
  return 0;
 }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
Thread  0
Thread  1
Thread  3
Thread  2
Taille liste =  5   sur  0
Taille liste =  5   sur  1
Taille liste =  5   sur  2
Taille liste =  5   sur  3
Lancement  "SCD1LoadDimSSKsFromDimAndFact"  sur  0
Lancement  "SCD1LoadDimSSKsFromDimAndFact"  sur  2
Lancement  "SCD1LoadDimSSKsFromDimAndFact"  sur  1
Lancement  "SCD1LoadDimSSKsFromDimAndFact"  sur  3