Bonjour, une partie de mon code réalise ceci :
Un thread 1 réalise une lecture de données dans un fichier. Après avoir lu une certaine quantité de données il emet un signal, capté par le thread 2, puis se mets en attente avec une QWaitcondition.
Le signal émit par le thread 1 réveille le thread 2 (QWaitCondition) qui traite les données. Lorsqu'il n'y a plus de données à traiter, le thread 2 émet un signal, capté par le thread 1, puis se met en attente (QwaitCondition).
Le signal émit réveille le thread 1 qui lit la suite des données, etc..
Problème :
Pendant quelques tours de boucle, tout se passe bien puis le problème arrive. Entre le moment où le thread 2 émet son signal (afin de dire qu'il a terminé de traiter les données) et le moment ou il se met en attente, il se passe énormément de temps (alors que les lignes de codes sont consécutives).
Pendant ce temps, le thread 1 a le temps de lire les données et de réveiller le thread 2 (qui ne s'est même pas encore endormi !). Du coup, tout le monde au dodo !
Devrais-je procéder autrement ? Puis-je retarder le emit ou empêcher la scission entre le emit et la mise en attente ?
Résumé
merci pour votre aide,
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
23
24
25
26
27 Thread 1 : debut boucle // lecture de données emit reveilThread2(&données) waitMutex1.lock(); waitCondition1.wait(&waitMutex1) waitMutex1.unlock(); fin boucle Thread 2 : début boucle si données // Traitement des données sinon { emit reveilThread1() waitMutex2.lock(); waitCondition2.wait(&waitMutex2) waitMutex2.unlock(); } fin boucle
Cédric.
Partager