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

后端 未结 6 1000
予麋鹿
予麋鹿 2020-12-09 22:08

I have a console application that is using a DLL file that uses a SetTimer() call to create a timer and fire a function within itself. The call is below:

<
6条回答
  •  没有蜡笔的小新
    2020-12-09 22:34

    Using Timer Queues

    Creates a timer-queue timer. This timer expires at the specified due time, then after every specified period. When the timer expires, the callback function is called.

    The following example creates a timer routine that will be executed by a thread from a 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. Then it creates a timer queue and a timer-queue timer, using the CreateTimerQueue and CreateTimerQueueTimer functions, respectively. The code uses the WaitForSingleObject function to determine when the timer routine has completed. Finally, the code calls DeleteTimerQueue to clean up.

    For more information on the timer routine, see WaitOrTimerCallback.

    Example code from MSDN:

    #include 
    #include 
    
    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 
    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:

    • https://msdn.microsoft.com/en-us/library/windows/desktop/ms682485(v=vs.85).aspx
    • https://msdn.microsoft.com/en-us/library/windows/desktop/ms687003(v=vs.85).aspx

提交回复
热议问题