2010-12-05 4 views
1

Comment est-ce que je m'assurerais de ne créer qu'un seul fil sur le bouton-poussoir sans avoir accidentellement double-cliqué?Commencer un filetage sur le bouton-poussoir

+0

Ceci est connu comme "debouncing". Voir par exemple http://blogs.msdn.com/b/oldnewthing/archive/2004/10/15/242761.aspx – MSalters

Répondre

0

Le code suivant devrait le faire (win32) ...

EnterCriticalSection(&critSec); 
if (ghThread != INVALID_HANDLE_VALUE) 
{ 
    ghThread = ::CreateThread(NULL, stackSize, (LPTHREAD_START_ROUTINE)ThreadEntry, NULL, 0, NULL); 
} 
LeaveCriticalSection(&critSec); 

Cela ne présupposent bien sûr vous Initialise le POIGNEE ghThread à INVALID_HANDLE_VALUE à l'avance.

+0

Cela dépend. Est-ce que plus d'un thread peut accéder à cette fonction? –

+0

@ Martin: vous avez raison martin ... coller une section critique autour du bloc entier résoudrait le problème ... édité – Goz

+1

@Goz: ne devrait pas être nécessaire, c'est win32. Le bouton poussoir a une affinité de thread, ce qui signifie que tous les clics arrivent sur le même thread. Comme ce bit de code n'est pas réentrant (ThreadEntry ne peut pas récupérer les messages pushbutton), cela signifie que les messages du bouton poussoir sont traités dans l'ordre. – MSalters

0

Parlez-vous de la programmation Windows? Je ne suis pas trop familier avec cela, mais vous devriez attraper WM_LBUTTONDOWN message (ou Double-cliquez) et mettre un drapeau booléen à TRUE. Et tout ce dont vous avez besoin est de ne pas créer de thread si ce drapeau est VRAI. Il doit être initialisé comme FAUX de cource.

+0

Quel est le but du drapeau? En outre, 'WM_LBUTTONDOWN' n'a pas d'indication de double clic. Ce n'est même pas un seul clic, seulement la première moitié. Vous avez besoin de messages séparés pour le glisser-déposer, pas pour les clics. – MSalters