Bonjour à tous,
J'ai construit une application Winform.
En cliquant sur un bouton, une procédure avec de nombreux calculs est lancée.
J'aimerais pouvoir arrêter correctement la procédure en appuyant sur la touche d'échappement (ESC).
Mais il y a plusieurs problèmes :
L'événement KeyDown mis en place sur le formulaire principal ne peut pas être remontée (comme une interruption) pendant que la procédure est en cours.
L'événement KeyDown ne peut pas être détecté tant que l'appelant (fonction button_Click()) n'a pas rendu le focus sur le formulaire principal.
L'événement KeyDown semble n'être détectable que lorsque l'application est disponible, en attente.
J'ai essayé différentes solutions :
J'ai placé la procédure de calcul dans un thread séparé, lancé par un bouton dont la fonction button_Click() se termine immédiatement après.
De cette façon, la détection de l'événement KeyDown devient possible au niveau du Thread principal (Form1). Ainsi, à l'aide d'un Flag, il est possible d'arrêter la procédure placée dans le fil.
Le problème est que les autres tâches qui devaient suivre la fin des calculs doivent également être placées dans le thread, sinon il n'est pas possible de continuer les opérations dans le thread principal après la fin des calculs.
Autre test : Utiliser un "Low level Keyboard hook" ( ).
Il fonctionne bien du moment qu'il utilisé dans le thread principal (Form1) et que l'application est en attente d'entrées de l'utilisateur, mais si le fil principal est en train d'exécuter la procédure de calcul (ce qui est le but), l'événement n'est détecté qu'à la fin du calcul, ce que l'on ne veut évidemment pas.
J'ai donc pensé à placer cette capture de clavier de bas niveau dans un autre thread séparé. Mais je ne sais pas comment faire.
Je cherche donc une chose très simple (cliquer sur ESC pour arrêter un calcul), mais il me semble difficile d'y arriver !
Y a-t-il quelqu'un pour m'aider, s'il vous plaît ?
Merci beaucoup.
Emmanuel
Partager