| 
| 
 | Вопрос # 3 943/ вопрос открыт / | 
 |  Здравствуйте, уважаемые эксперты!Помогите с реализацией таймера в СИ. Необходимо: создать таймер по убыванию. Пользователем задается количество минут, через произойдет закрытие программы. Может кто знает как реализовать такой таймер?
 Зарание спасибо!!!!
 
|  |   Вопрос задал: Ученый (статус: 8-ой класс)Вопрос отправлен: 28 марта 2010, 11:12
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: min@y™ Если это приложение делается для windows, то можно воспользоваться WinAPI-функциями SetTimer() и KillTimer(). Отлавливать событие таймера можно двумя способами: 1) передать в функцию SetTimer() указатель на callback-функцию (обработчик события);
 2) отлавливать сообщение WM_TIMER в оконной процедуре.
 Примеров в интернете - туева хуча. Достаточно набрать в гугле правильный запрос.
 
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 28 марта 2010, 11:32
 Оценка за ответ: 5
 |  
 Мини-форум вопросаВсего сообщений: 11; последнее сообщение — 30 марта 2010, 14:15; участников в обсуждении: 3. 
|   | Ученый (статус: 8-ой класс), 28 марта 2010, 11:55 [#1]:min@y™- приведи пожалуйста свой пример: как сделать так что бы у меня функция int tm()
 {i++;
 system("cls");
 printf("%d",i);
 }
 вызывалась каждую секунду?
 |  
|   | min@y™ (статус: Доктор наук), 28 марта 2010, 12:07 [#2]:В какой среде и под какую ОС ты пишешь программу? Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Ученый (статус: 8-ой класс), 28 марта 2010, 12:14 [#3]:пишу консолку на си под WinXP в MinGW Developer Studio. |  
|   | min@y™ (статус: Доктор наук), 28 марта 2010, 12:24 [#4]: Цитата (Ученый): пишу консолку на си под WinXP в MinGW Developer Studio.  С этой средой я незнаком.
 Кстати, ты правильный запрос в гугл отсылал? А то твой вопрос продолжает оставаться в виртуальной категории "Погуглите за меня".
 Залезь ты в MSDN да посмотри инфу про SetTimer() или почитай парочку (из 100500 мильёнов) примеров в инете.
 Или ты предлагаешь, чтобы я себе щас скачал MinGW Developer Studio и написал для тебя программу? Я согласен. Сколько пива ставишь?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Ученый (статус: 8-ой класс), 28 марта 2010, 12:34 [#5]:да среда тут особо не причем. С он и в африке с. Если бы на С++ я бы понял как это возможно, а вот на классическом си, без классов я не знаю как это реализовать. |  
|   | Вадим К (статус: Академик), 28 марта 2010, 17:55 [#6]:Тут проблема не в классическом/неклассическом С. Тут проблема в том, что таймеры не являются частью стандарта, поэтому надо "уточнять". Хотя в данном случае с большой вероятностью заработает код вида
 
 #include <unistd.h>
for (int i = 0; i<1000; i++) {
printf("%d", i);
usleep(1000);
}Правда, если хочется именно функцию вызывать, то тут наверно веселее будет сделать тред
  , который секунду спит, потом вызывает функцию. 
 А вот функция setTimer тут стоит обособлено. Это апи функция и от того, какой язык используется, меняется только формат вызова, хотя для с и с++ он идентичный.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 28 марта 2010, 19:16 [#7]:Классический Си - это что? Опиши более детально, что тебе нужно.
 В твоей среде можно использовать WinAPI или нет?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Ученый (статус: 8-ой класс), 30 марта 2010, 13:11 [#8]:если быть предельно кратким и выражаться яснее, то задача вот в чем: мне через определенный период времени нужно прервать работу функции getch(), которая ждет нажатия клавиши. WinAPI использовать можно. |  
|   | Вадим К (статус: Академик), 30 марта 2010, 13:50 [#9]:да... называется "я упростил задачу". Это не упрощение, а .... 
 Теперь по полочкам. В windows просто так наверно не получиться, потому что getch скорее всего будет вызывать ReadConsole который нормально прерывается только убиением процесса (можно и не убивать, но.. сложно достаточно).
 
 Всё обычно делается просто - с помощью select и чтением с консоли. Но это просто в Линуксе
  
 Можно попробовать воспользоваться функцией khbit, которая просто проверяет, нажата ли клавиша
 
 
 int i = 0;
while(!kbhit() || i < 10) {
  usleep(100);
}этот код будет ждать нажатия любой клавиши или 1 секунду (100 * 10 = 1000 мс).Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Ученый (статус: 8-ой класс), 30 марта 2010, 14:02 [#10]:а можно при этом определить какая именно клавиша была нажата? |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |