Can I use the SetTimer () API in a C ++ console application?

I have a console application that uses a DLL file that uses the SetTimer() call to create a timer and runs the function internally. Call below:

 SetTimer((HWND)NULL, 0, timer_num, (TIMERPROC)UnSyncMsgTimer)) == 0) 

Timer messages are expected, but this will never happen. I assume that my console application, and not a standard application for the Windows GUI (for example, when the DLL file was originally used). This terminates a key part of the functionality of the DLL files.

My application should remain a console application, and I cannot change the DLL.

Is there any work to do this work?

+8
c ++ windows timer console
source share
6 answers

You can use the CreateTimerQueueTimer function

 HANDLE timer_handle_; CreateTimerQueueTimer(&timer_handle_, NULL, TimerProc, user_object_ptr, 10, 0, WT_EXECUTEDEFAULT); //callback void TimerProc(PVOID lpParameter, BOOLEAN TimerOrWaitFired) { user_object* mgr = (user_object*) lpParameter; mgr->do(); DeleteTimerQueueTimer(NULL, timer_handle_, NULL); timer_handle_ = NULL; } 
+9
source share

Timers set using the SetTimer API require active handling of Windows messages because time messages are sent there.

If you need a timer thread, you can register the Window class and create a default message pump (see this article for a brief example), but a simpler process would probably be to simply deploy a second thread to handle your synchronization events and send notifications.

+5
source share

Take a look at the following example which shows how to use WM_TIMER messages with a console application:

(credit simplesamples.info )

 #define STRICT 1 #include <windows.h> #include <iostream.h> VOID CALLBACK TimerProc(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime) { cout << "Time: " << dwTime << '\n'; cout.flush(); } int main(int argc, char *argv[], char *envp[]) { int Counter=0; MSG Msg; UINT TimerId = SetTimer(NULL, 0, 500, &TimerProc); cout << "TimerId: " << TimerId << '\n'; if (!TimerId) return 16; while (GetMessage(&Msg, NULL, 0, 0)) { ++Counter; if (Msg.message == WM_TIMER) cout << "Counter: " << Counter << "; timer message\n"; else cout << "Counter: " << Counter << "; message: " << Msg.message << '\n'; DispatchMessage(&Msg); } KillTimer(NULL, TimerId); return 0; } 
+3
source share

Have you considered Waiting Timers or Timer Queues ? Although you can use SetTimer from a console application, these other objects may be more suitable for you.

+1
source share

Using timer queues

Creates a timer timer. This timer expires at the specified time, then after each defined period. When the timer expires, the callback function is called.

The following example creates a timer procedure that will execute a thread from the timer queue after a 10 second delay. First, the code uses the CreateEvent function to create an event object that is signaled when the timer queue thread completes. This then creates a timer queue and a timer queue timer using CreateTimerQueue and CreateTimerQueueTimer functions, respectively. The code uses the WaitForSingleObject function to determine when the timer procedure has completed. Finally, the code calls DeleteTimerQueue to clear it.

For more information on the timer procedure, see WaitOrTimerCallback .

Sample code from MSDN:

 #include <windows.h> #include <stdio.h> HANDLE gDoneEvent; VOID CALLBACK TimerRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired) { if (lpParam == NULL) { printf("TimerRoutine lpParam is NULL\n"); } else { // lpParam points to the argument; in this case it is an int printf("Timer routine called. Parameter is %d.\n", *(int*)lpParam); if(TimerOrWaitFired) { printf("The wait timed out.\n"); } else { printf("The wait event was signaled.\n"); } } SetEvent(gDoneEvent); } int main() { HANDLE hTimer = NULL; HANDLE hTimerQueue = NULL; int arg = 123; // Use an event object to track the TimerRoutine execution gDoneEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (NULL == gDoneEvent) { printf("CreateEvent failed (%d)\n", GetLastError()); return 1; } // Create the timer queue. hTimerQueue = CreateTimerQueue(); if (NULL == hTimerQueue) { printf("CreateTimerQueue failed (%d)\n", GetLastError()); return 2; } // Set a timer to call the timer routine in 10 seconds. if (!CreateTimerQueueTimer( &hTimer, hTimerQueue, (WAITORTIMERCALLBACK)TimerRoutine, &arg , 10000, 0, 0)) { printf("CreateTimerQueueTimer failed (%d)\n", GetLastError()); return 3; } // TODO: Do other useful work here printf("Call timer routine in 10 seconds...\n"); // Wait for the timer-queue thread to complete using an event // object. The thread will signal the event at that time. if (WaitForSingleObject(gDoneEvent, INFINITE) != WAIT_OBJECT_0) printf("WaitForSingleObject failed (%d)\n", GetLastError()); CloseHandle(gDoneEvent); // Delete all timers in the timer queue. if (!DeleteTimerQueue(hTimerQueue)) printf("DeleteTimerQueue failed (%d)\n", GetLastError()); return 0; } 

This is another example code from MSDN

This is another example from Codeproject.

 #include <windows.h> HANDLE hTimer = NULL; unsigned long _stdcall Timer(void*) { int nCount = 0; while(nCount < 10) { WaitForSingleObject(hTimer, 5000); cout << "5 s\n"; nCount++; } cout << "50 secs\n"; return 0; } void main() { DWORD tid; hTimer = CreateEvent(NULL, FALSE, FALSE, NULL); CreateThread(NULL, 0, Timer, NULL, 0, &tid); int t; while(cin >> t) { if(0==t) SetEvent(hTimer); } CloseHandle(hTimer); } 

Resource:

+1
source share

Very simple timer without Windows

 MSG Msg; UINT TimerId = (UINT)SetTimer(NULL, 0, 0, NULL); // 0 minute while (TRUE) { GetMessage(&Msg, NULL, 0, 0); if (Msg.message == WM_TIMER) { KillTimer(NULL, TimerId); cout << "timer message\n"; TimerId = (UINT)SetTimer(NULL, 0, 60000, NULL); // one minute. } DispatchMessage(&Msg); } 
0
source share

All Articles