J'ai remarqué que AutoResetEvent gèle complètement la boucle de message (parfois) quand il est au milieu d'un appel WaitOne(), bloquant même le message de signal.Objets AutoResetEvent et COM
IE:
- (IU) Nouveau fil donné naissance à
- (UI) Code appelle WaitOne(); délai d'attente: 10s
- (T2) Fil ouvre dispositif, les appels Set()
- (UI) blocs WaitOne boucle messages
- (UI) délai de WaitOne écoulé, l'exécution de code continue
- (UI) Fenêtre principale reçoit le signal et continue (mais WaitOne a échoué)
Des idées?
EDIT: ajout d'UI/T2 pour spécifier les unités d'exécution. En outre, j'essaie de transformer une bibliothèque tierce en synchrone. L'ouverture de périphériques implique un appel Open() qui à son tour engendre un événement OpenOK ou OpenFailed, j'essaye de faire un appel booléen Open() qui renvoie true/false en fonction de l'événement engendré.
Pourriez-vous préfixer avec quel thread chaque opération s'exécute (peut-être utiliser UI, T1, T2, etc) dans les étapes ci-dessus. C'est un peu plus difficile à suivre quel fil est ce qui dans votre description. – SwDevMan81
En outre, si vous le souhaitez, vous pouvez définir l'état de l'AutoResetEvent à signaler lorsque vous le créez de sorte que vous n'arrêtez pas le premier appel (si c'est ce que vous voulez) -> AutoResetEvent e = AutoResetEvent (true); – SwDevMan81
Définir "ouvre l'appareil". Vous pouvez vous assurer que l'ouverture du périphérique ne dépend pas des messages traités par la boucle de message. –