Ich habe eine Konsolenanwendung, die eine DLL-Datei verwendet, die einen SetTimer()
Aufruf verwendet, um einen Timer zu erstellen und eine Funktion in sich selbst auszulösen. Der Anruf ist unten:
Es wird erwartet, Timer-Nachrichten zu empfangen, aber das passiert nie. Ich gehe davon aus, dass es sich bei mir um eine Konsolenanwendung und nicht um eine Standard-Windows-GUI-Anwendung handelt (z. B. wo die DLL-Datei ursprünglich verwendet wurde). Dies hält einen wichtigen Teil der Funktionalität der DLL-Dateien davon ab, zu arbeiten.
Meine Anwendung muss eine Konsolenanwendung bleiben und ich kann die DLL nicht ändern.
Gibt es eine Arbeit, um das funktionieren zu lassen?
Bei Zeitgebern, die mit der API SetTimer
festgelegt wurden, muss eine Windows-Nachrichtenverarbeitungsfunktion aktiv ausgeführt werden, da dort die Zeitnachrichten gesendet werden.
Wenn Sie einen Timer-Thread benötigen, können Sie eine Window-Klasse registrieren und eine Standard-Window-Message-Pumpe erstellen (siehe Dieser Artikel für ein kurzes Beispiel), aber ein einfacherer Prozess wäre wahrscheinlich, nur einen zweiten Thread hochzufahren, um Ihre Timing-Ereignisse zu verarbeiten und Benachrichtigungen zu senden.
Sehen Sie sich das folgende Beispiel an, das zeigt, wie Sie WM_TIMER-Nachrichten mit einer Konsolenanwendung verwenden können:
(Guthaben auf der Website simplesamples.info )
%Vor% Haben Sie Waitable Timer in Betracht gezogen? oder Timer-Warteschlangen ? Es ist zwar möglich, SetTimer
über eine Konsolenanwendung zu verwenden, diese anderen Funktionen sind jedoch möglicherweise besser für Sie geeignet.
Verwenden von Timer-Warteschlangen
Erstellt einen Timer-Queue-Timer. Dieser Timer läuft am angegebenen Fälligkeitsdatum ab Zeit, dann nach jeder bestimmten Zeit. Wenn der Timer abläuft, wird die Callback-Funktion wird aufgerufen.
Das folgende Beispiel erstellt eine Timer-Routine, die von ausgeführt wird ein Thread aus einer Timer-Warteschlange nach einer 10 zweite Verzögerung. Zuerst die Der Code verwendet die
CreateEvent
-Funktion zum Erstellen ein Ereignisobjekt das wird signalisiert, wenn der Timer-Queue-Thread abgeschlossen ist. Dann es erstellt eine Timer-Queue und einen Timer-Queue-Timer mit demCreateTimerQueue
und CreateTimerQueueTimer-Funktionen, beziehungsweise. Der Code verwendet die FunktionWaitForSingleObject
Bestimmen, wann die Timer-Routine abgeschlossen ist. Endlich der Code ruftDeleteTimerQueue
auf, um aufzuräumen.
Weitere Informationen zur Timer-Routine finden Sie unter WaitOrTimerCallback
.
Beispielcode von MSDN:
%Vor%Dies ist ein weiterer Beispielcode aus MSDN
Dies ist ein weiteres Beispiel aus Codeproject
%Vor%Ressource: