|
Вопрос # 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]:
а можно при этом определить какая именно клавиша была нажата?
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|