2010-11-22 8 views
2

Ich programmiere mit winapi. Wie warte ich auf eine Nachricht für eine bestimmte Zeit? Wenn keine Nachricht vorhanden ist, kann ich eine andere Aufgabe ausführen. Ich kann Sleep nicht verwenden, da das Fenster Callback-Verfahren verzögert wird.Warte auf eine Fenstermeldung für eine definierte Zeit

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 
    } 
} 

Antwort

6

Genau das ist MsgWaitForMultipleObjects.

+0

Diese Funktion wartet nicht auf Fensterereignisse. – Squall

+1

Ja, tut es. Siehe das dwWaitMask-Argument für die Arten von Ereignissen, auf denen es aufwachen kann. –

+0

Diese Funktion schlägt fehl und GetLastError() gibt ERROR_INVALID_HANDLE zurück. Ich versuchte MsgWaitForMultipleObjects (1, (HANDLE *) & hwnd, wahr, 30, QS_ALLEVENTS); MsgWaitForMultipleObjects (1, & current_thread, true, 30, QS_ALLEVENTS); – Squall

0

Dies scheint wie eine seltsame Anfrage. Windows-Programme sollten reagieren. Wenn call_a_function viel Zeit in Anspruch nimmt, erhält Ihre App die Meldung "Dieses Windows reagiert nicht".

Außerdem geht GetMessage in einen Wartezustand, wenn keine Nachrichten in der Warteschlange vorhanden sind. Ich verstehe nicht, warum Ihre Nachrichtenschleife so anders aussieht als die canonical message loop.

Ich denke, um diese Frage gut zu beantworten, wäre es hilfreich, den Zweck Ihrer Routine call_a_function zu kennen.

Verwandte Themen