Bonjour,
Ayant cherché pas mal et n'ayant pas trouvé de réponses satisfaisantes, je me permet de poser mon problème ici, en espérant qu'un âme charitable trouve une solution.
Donc j'ai un control avec une event KeyDown, et je veux déclencher une action quand deux touches précises sont enfoncées simultanément.
voici le code:
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
28
29
30
31
32 private void globalEventProvider1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == keyOne) { KeyOnePressed = true; } if (e.KeyCode == keyTwo) { KeyTwoPressed = true; } if (e.KeyCode == keyOne ||e.KeyCode == keyTwo) { var t = new Thread(criticalSection); t.Start(); t.Join(); } } private static Semaphore sem = new Semaphore(1, 1); private void criticalSection() { sem.WaitOne(); if (KeyOnePressed && KeyTwoPressed) { KeyOnePressed = false; KeyTwoPressed = false; MessageBox.Show("OK"); } sem.Release(); }
Le problème ici est que comme vous pouvez le constater j'utilise un thread séparé pour l'action finale.
J'en suis arrivé la car si je met le code de ce thread directement dans la première fonction, la message box se lance toujours deux fois.
J'ai essayer de protéger se morceau de code avec un lock, un mutex, rien n'y fait.
Si on appui sur deux touches en simultané, deux threads se lancent pour gérer les évènements des touches, ils sont différents mais pourtant les restrictions tels que le lock ou le mutex ne s'applique pas a eux.
Comme si c'était un seul et unique thread.
J'aimerais qu'on m'explique simplement pourquoi le lock ou le mutex ne marche pas dans ce cas précis et s'il existe une façon plus propre que mon code pour le faire.
En passant, cela pourrait il avoir un rapport avec le nombre de coeurs du processeur ?
Merci et bonne journée.
Partager