Использование таймеров в микросекундах в Windows с компилятором mingw?

#c #windows #timer #mingw

#c #Windows #таймер #mingw

Вопрос:

Я хочу установить таймер. По истечении времени он должен вызвать функцию обратного вызова. Но время указано в микросекундах. Я нахожу мультимедийные таймеры в Windows, но я использую компилятор mingw в Windows. Итак, есть ли какой-либо метод, использующий компилятор mingw в Windows.

Я пытался использовать https://learn.microsoft.com/en-us/windows/win32/sync/using-timer-queues

Но у меня ошибка: «CreateTimerQueue() не был объявлен в этой области» Как мне это решить?

 #include <windows.h>
#include <stdio.h>

HANDLE gDoneEvent;

VOID CALLBACK TimerRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired)
{
    if (lpParam == NULL)
    {
        printf("TimerRoutine lpParam is NULLn");
    }
    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;
    }
}
  

Комментарии:

1. Есть ли у вас доступ к WinAPI в mingw? Если вы это сделаете, SetWaitableTimer может быть полезно.

2. На самом деле да, но когда я использую функцию CreateTimerQueue(), появляется ошибка «CreateTimerQueue() не был объявлен в этой области», хотя я включаю файл <windows.h> . У вас есть идея, почему возникает эта ошибка? @TedLyngmo

3. Вы включили threadpoollegacyapiset.h ? Можете ли вы заставить работать один таймер ( CreateWaitableTimer )?

4. Также есть такая же ошибка: ‘threadpoollegacyapiset. h Нет такого файла или каталога ‘. Есть ли какой-либо макрос, чтобы добавить мой код для использования WinAPI с Mingw? Я погуглил, но не смог найти ответ. @TedLyngmo

5. Можете ли вы заставить работать один таймер (а не пул таймеров)? В любом случае, если вам не хватает файлов заголовков в вашей среде разработки, это будет громоздко.