Bonjour,

Dans une application multithread (1 thread "GUI" fait en Qt et 1 thread "métier" non Qt) qui est déjà en place, j'ai besoin de synchroniser le thread GUI avec le thread métier car actuellement, ce n'est pas fait, et évidement... ça pose des problèmes !

Comme tout le code est déjà fait, j'aimerais éviter de devoir éditer toutes les fonctions de la GUI pour y ajouter un mutex à chaque fois qu'elle accède aux données du thread métier. Surtout qu'il y a toujours le risque d'en oublier une.

L'idée est de procéder ainsi :

A chaque "boucle" du thread métier, ajouter un mutex, les données à protéger n'étant utilisées que dans cette boucle :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
fonction boucleDuThread()
{
    mutex.lock();          // <== j'ajouterais ça
 
    // Le traitement métier déjà existant qui manipule les données
 
   mutex.release();          // <== j'ajouterais ça
}
Et dans le code de la GUI :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
fonction boucleEvenementsQt(event)
{
    mutex.lock();
 
    traiterEvenementQt(event);
 
   mutex.release();
}
Ainsi, je me dis que :
- lorsque la GUI traite un évènement (que ce soit souris, clavier, timer, réseau, affichage...) le thread métier est bloqué
- lorsque le thread métier est en cours de calcul, la GUI est bloquée

C'est probablement très moche, mais j'ai besoin de faire "au plus pressé" et au plus sûr, quitte à dégrader un peu les performances et à bloquer le mutex pendant le traitement de certains évènements qui ne le nécessiterais pas forcément.

Du coup, j'essaie de jouer avec les QEventLoop, QAbstractEventDispatcher, QApplication, processEvents()...

mais je n'arrive pas à trouver comment remplacer la boucle d’évènements "principale" de l'application Qt et du coup, pouvoir bloquer les évènements à destination de tous les widgets, les timers, les sockets.... tout ça d'un coup d'un seul.

Auriez-vous une idée de "où intervenir" pour faire ça ?

Merci !