функция будильника в Linux и Windows -> не может найти эквивалент для Windows -> C - PullRequest
4 голосов
/ 22 декабря 2010

Я некоторое время работал над Linux и выполнил некоторые программы на C, и теперь мне нужно создать приложение для Windows, но нелегко найти замену функции будильника (можно найти в signal.h) ...

Дело в том, что в Linux, когда вы устанавливаете флаг тревоги как SIGALRM (если не ошибаюсь), ОС собирается выполнять некоторую функцию, когда тревога отключается.Пример:

signal(SIGALRM, myfunc);
alarm (2);

Что произойдет в этом примере, так это то, что ОС будет вызывать функцию myfunc каждые 2 секунды (в Windows, вероятно, будут миллисекунды, но не обращайте внимания на детали)сейчас).

Некоторое время я искал, как сделать то же самое для окон (только с помощью windows.h atm), но не могу найти замену этому (искал тысячи раз на msdn),а в окнах отсутствует сигнал SIGALRM для сигнала. h .....

Что я могу использовать в C для того же поведения, что и сигнал тревоги с флагом SIGALRM? (Другими словами,функция, которая позволяет выполнять другую функцию, используя сигнал тревоги или аналогичный).

Ответы [ 2 ]

3 голосов
/ 22 декабря 2010

Использование alarm / SIGALRM не является безопасным способом «запуска функции в данный момент времени», потому что функция вызывается в контексте обработки сигналов, где использование практически любых библиотечных функций небезопасно.На самом деле, единственное хорошее использование для SIGALRM - это установка обработчика сигналов бездействия с sigaction для прерывания системных вызовов, чтобы системный вызов, который, как вы ожидаете, мог зависнуть, прерывался EINTR.

Если вы хотите выполнить заданную задачу через 1008 * секунд, самый безопасный способ сделать это - запустить новый поток, который спит N секунд, а затем выполнить задачу.Это должно работать в любой операционной системе с потоками.

Windows также имеет свой собственный тип событий таймера, которые могут доставляться через систему сообщений Windows, но их использование сделает ваш код намного более ориентированным на Windows.

3 голосов
/ 22 декабря 2010

Проверьте MSDN для timeSetEvent. Это не совсем то же самое, что alarm, но может быть достаточно близко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...