Bonjour à tous,
J'ai une petite application avec beaucoup de threads de calculs (enfin 8, quoi... pour alimenter chacun des coeurs de mon 3770K tout neuf).
En effet, l'appli que j'écris nécessite énormément de calculs sur des données facilement séparables en zones.
Par contre, ces calculs se font en deux phases, et à chaque phase, il faut attendre que toutes les phases aient fini avant de passer à la phase suivante.
Je veux donc créer deux Rendez-vous.
Pour ce faire j'utilise deux QWaitCondition:
et comme code des deux slots...
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 void Comportement::run() { for(;;) { Mutex1.lock(); // J'ai essayé sans les locks ... Taf de la phase 1 .... emit TerminatedPhase1(numThread); Condition1.wait(&Mutex1); Mutex2.lock(); ... Taf de la phase 2 ... emit TerminatedPhase2(numThread); Condition2.wait(&Mutex2); } }
Au bout de quelques passages (5 en general) l'un des threads ne redémarre pas en Phase 1...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void Pilote::MiseAJour1(int numThread) { Event1 |= 1<<numThread; if(Event1 == (1<<mNbThread) -1) { Event1 = 0; for(int i=0; i<mNbThread; i++) mComportement[i]->Condition1.wakeOne(); } }
J'ai essayé evec une QWaitCondition static et un wakeAll... Pas mieux, là, c'est tout les threads qui se bloquent...
Bref, je ne sais pas créer un rendez-vous en Qt?
Comment feriez-vous? Merci d'avance.
Partager