2010-11-22 28 views
2

Je programme avec winapi. Comment puis-je attendre un message pendant une durée définie? S'il n'y a pas de message, je peux faire une autre tâche. Je ne peux pas utiliser Veille, car la procédure de rappel de la fenêtre sera retardée.Attendre un message de fenêtre pendant une durée définie

while (true){ 
    ...//wait a message for 30 miliseconds 
    GetMessage(&message, hwnd, 0, 0)) or PeekMessage(&message, hwnd, 0, 0, PM_REMOVE) 
    ... 
    if (no_message){ 
     call_a_function(); 
    } else { 
     if (finish) 
      break; 
     TranslateMessage(&message); 
     DispatchMessage(&message); 
     ...//set to wait 30 minus elapsed time 
    } 
} 

Répondre

6

C'est exactement ce à quoi correspond MsgWaitForMultipleObjects.

+0

Cette fonction n'attend pas les événements de fenêtre. – Squall

+1

Oui, c'est le cas. Voir l'argument dwWaitMask pour les types d'événements sur lesquels il peut se réveiller. –

+0

Cette fonction échoue et GetLastError() renvoie ERROR_INVALID_HANDLE. J'ai essayé MsgWaitForMultipleObjects (1, (HANDLE *) & hwnd, true, 30, QS_ALLEVENTS); MsgWaitForMultipleObjects (1, & current_thread, true, 30, QS_ALLEVENTS); – Squall

0

Cela semble être une demande étrange. Les programmes Windows devraient être réactifs. Si call_a_function prend beaucoup de temps, votre application recevra le traitement "Cette fenêtre ne répond pas". De plus, GetMessage passe à l'état d'attente s'il n'y a aucun message posté dans la file d'attente. Je ne comprends pas pourquoi la boucle de votre message est si différente de la canonical message loop.

Je pense que pour répondre à cette question, il serait utile de connaître le but de votre routine call_a_function.