Windows Timer (kein Mfc o.ä.) startet erst verzögert
-
Hi,
leider kann ich gerade nicht im Forum suchen, deshalb hoffe ich, dass das Thema nicht schon x mal behandelt wurde. Folgendes Problem:
Ich habe einen Timer mit SetTimer(..) mit einem Intervall von 200ms initialisiert. Genau genommen so:
SetTimer(g_waitDialog, WAIT_TIMER_ID, 200, (TIMERPROC)WaitTimerMethod);
Leider wird die Callback-Funktion nicht sofort aufgerufen (also NACH den 200ms)? Ist das normal? Braucht es eine gewisse Zeit, bis die Funktion zum ersten mal aufgerufen wird??
Tipps würden mir wirklich weiterhelfen, da die Win32-API doch recht kryptisch ist.
Danke,
Felix
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
nicht sofort heist nach ?? 200,001ms? 2s? 20s?
-
Wenn es sich nur um ein paar ms handelt: Wie so oft gesagt, Windows ist kein Realtime-OS. Das heißt, es garantiert keinem Programm, dass es zu einem bestimmten Zeitpunkt die CPU hat. Mit etwas Pech kann ein Programm für ein paar Sekunden gar nicht zum Zuge kommen.
-
Also, erstens habe ich den "Fehler" (welcher keiner ist gefunden. Aber zunächst einmal: ich bin mir im klaren, dass Windows kein Realtime-System ist. Das habe ich auch gar nicht gewollt.
Es war so, dass die Funktion scheinbar gar nicht aufgerufen wurde. Allerdings liegt folgender Sachverhalt vor:
Ich starte einen Dialog mit einer Progress Bar, um den Ladefortschritt von verschiednenen Dateien anzuzeigen. Ich denke, dass die Timer-Callback nur aufgerufen bzw. bearbeitet wird, wenn sich der restliche Code zwischen 2 Dateien befindet, da der Thread (main) ansonsten mit dem Laden beschäftigt ist. Liege ich damit richtig??
Wenn ja, starte ich einfach einen eigenen Thread für den Timer-Callback.
Wenn nein (also, wenn die Timer-Events doch abgearbeitet werden), was ist es dann??
-
Wenn du im Hauptthread irgendwo in einer Schleife oder einem länger dauernden Funktionsaufruf hängst werden währenddessen natürlich keine anderen Messages verarbeitet. Am einfachsten wäre es wohl, du würdest diese Aktion (das Laden) in einen Thread packen - nicht die Timer Behandlung (das würde nicht allzuviel Sinn machen)
-
Ja, eigentlich hast Du Recht. Nur leider ist das alles in einer ziemlich großen Applikation und ich habe nicht sehr viel Gestaltungsspielraum. Leider wurder der WaitDialog, der mit der ProgressBar angezeigt werden soll, nur schnell mit reinem C-Code gehackt. Wenn ich am Laden was ändern wollte, müsste ich zu viel umgestalten.
Da es sich um wenige, aber große Dateien handelt, die lange zum laden brauchen, wollte ich einen Pfusch machen: Ich lasse zunächst berechnen, wie viele Elemente es gibt und habe so meine Unterteilung der 100%. Dann lasse ich den Timer loslegen und immer ein Prozent hochzählen, bis entweder die Datei fertig ist (dann springt der Zähler auf den nächsten Schritt) oder der Timer bereits bis zum nächsten Schritt gekommen ist (dann wartet die ProgressBar).
Ist nicht schön, aber die einzige Möglichkeit, die ich im Kontext sehe....

-
Wenn du den Ladevorgang nicht in einen extra Thread auslagern kannst und die ganze Datei am Stück ausgelesen wird (nicht overlapped) - er also in einer Schleife hängt und du hier nichts verändern kannst, sehe ich für dich leider überhaupt keine Möglichkeit
