Lorsque je suis dans le thread de main() et que mon objet Runner est dans le thread B:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
// Thread main() avec une QEventLoop qui tourne
Runner runner;
 
QThread threadB;
runner->moveToThread(&threadB);
threadB.start();
 
// Long traitement, des choses se passent aussi dans le thread B
 
QMetaObject::invokeMethod(&runner,"process",Qt::QueuedConnection);
 
// Long traitement
La doc dit:

Qt::QueuedConnection : The slot is invoked when control returns to the event loop of the receiver's thread. The slot is executed in the receiver's thread.
Donc quand je demande d'invoquer la fonction"process" avec invokeMethod, Qt ajoute un évènement à l'event loop du thread B (pour exécuter la fonction "process") qui sera exécuté une fois que le thread B retournera dans son event loop.

Ce que je me demande c'est à quel moment cet évenement est ajouté à l'event loop du thread B?
1) Directement à la ligne QMetaObject::invokeMethod...? Cela veut dire que le thread de main() accède à des ressources du thread B alors qu'il travaille peut être. Les event loop de Qt sont peut être thread safe?
2) Au retour à l'event loop du thread main()? Ca ne change rien.
3) Au retour à l'event loop du thread B? Ce qui m'étonnerait, le thread de main() devrait alors attendre le bon moment.

Merci d'avance.