Событие таймера в консольном приложении C для Windows 32 - PullRequest
0 голосов
/ 11 октября 2018

Я не эксперт по Windows, и написал только пару программ с графическим интерфейсом VB.Я управляю языком K & R C и многими ассемблерами, и имею 35+ лет опыта работы со встроенными системами и приложениями управления микропроцессорами.Так что я в основном аппаратный + электронщик.Я знаю, что прерывания, используемые в простом, неконтрольном программном обеспечении или в старом стиле DOS, больше не возможны в Windows по многим уважительным причинам.Я также знаю, что следует создавать специальные драйверы и создавать потоки, если в Windows будут использоваться защищенные прерывания.Итак, эксперты: я прошу прощения, если мой вопрос звучит слишком просто или наивно.Я "искал и исследовал", но не нашел простого решения. Неблокирующий таймер сна в C , Таймер для реализации функции тайм-аута , Используя таймеры , все используют графический интерфейс или C ++ или слишком сложны.

Мне нужно написать консольное приложение Windows32, которое реализует большой конечный автомат, и необходимо несколько таймеров тайм-аута связи вместе с некоторыми другими таймерами одновременных процессов, в диапазоне от 1 мс до нескольких десятков минут.Sleep () не будет работать, потому что автомат продолжает работать, ожидая, пока эти события сообщат об их завершении.Я нашел это решение CreateWaitableTimer с асинхронным вызовом процедуры .Должен ли этот код работать в K & R C и как будет выглядеть этот код?Если я прав, функция обратного вызова может содержать небольшой код, необходимый для таймеров, без зависания программы, как это делает Sleep ().Я использую MS Visual Studio 2012 в качестве компилятора C.Я был бы очень признателен за любые советы и помощь для очень простого решения C.

1 Ответ

0 голосов
/ 12 октября 2018

Большой конечный автомат, кажется, путь.Что-то вроде:

int state = STATE_POWERUP, done = 0;
DWORD timeout;

while (! done) {
    DWORD ticks = GetTickCount();

    case (state) {
    STATE_POWERUP:
       . . .
       state = STATE_INIT1;
       break;

    STATE_INIT1:
       timeout = ticks + 30;
       state = STATE_INIT2;
       break;
    STATE_INIT2:
       if (ticks < timeout) { break; }
       . . .
       state = STATE_INIT3;
       break;
    STATE_INIT3:
       . . .

    default:
        assert(0);
    }
}
...