Модератор: Модераторы разделов
BratSinot
Сообщения: 812
ОС: Slackware64
Сообщение
BratSinot » 13.09.2009 21:43
Вопрос: Какой код можно написать чтоб функция срабатывала через определенное время. Поясняю:
Код: Выделить всё
for(;;)
{
if(timer1-timer2==1000) {printf("test");}
}
То есть чтоб printf сработал через определенное время? Пробовал через clock(). Мол:
Код: Выделить всё
int q, w=clock();
for(;;)
{
q=clock();
if(q-w>=1000){printf("test");}
}
Должно было сработать но он попросту виснет.
P.S. Еще раз с Днем Программиста!
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux
Сообщение
watashiwa_daredeska » 13.09.2009 21:50
man sleep
man usleep
man nanosleep
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3
Сообщение
nesk » 13.09.2009 21:52
а можно еще man alarm
Это полезно, что бы в рамках одного процесса выполнять какой то код и периодически вызывает еще какую то функцию.
Внимание : У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.
0xDEFEC8ED
Cra3y
Сообщения: 80
ОС: Debian
Сообщение
Cra3y » 13.09.2009 21:52
В аттаче примерчик на C++
Используются pthread+usleep
Основная функция:
Код: Выделить всё
// ....
typedef struct{
TTimer* ptimer;
THandler* phandler;
}timerArgs;
void* timerProc(void* arg) {
timerArgs* args=(timerArgs*)arg;
THandler* phandler = args->phandler;
TTimer* ptimer = args->ptimer;
long interval = ptimer->getInterval();
while (true) {
long cnt = interval;
while(cnt > 0) {
usleep(1000);
cnt--;
if(ptimer->running() == false)
return NULL;
}
phandler->onTimer(ptimer);
}
return NULL;
}
// ....
Особо не пинать, писал для себя )
У вас нет необходимых прав для просмотра вложений в этом сообщении.
HP G62 (AMD Phenom II x3 1.8GHz 4GB DDR3 Ram) / Debian 8 amd64
BratSinot
Сообщения: 812
ОС: Slackware64
Сообщение
BratSinot » 13.09.2009 21:57
А sleep это разве стандарт? Я что-то не нашел заголовка или что-то похожее. Это не Борланд случаем? Если он то у него есть delay. А мне надо на стандартах C89 и C++. Короче на GCC что-бы работало и в GNU/Linux и во всяких MinGW.
alfss
Сообщения: 262
Сообщение
alfss » 14.09.2009 01:30
#include <unistd.h>
unsigned int sleep(unsigned int seconds);
man 3 sleep
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
drBatty » 14.09.2009 02:32
BratSinot писал(а): ↑ 13.09.2009 21:43
Пробовал через clock(). Мол:
ага
The clock() function returns an approximation of processor time used by the program.
потому используйте sleep, она для этого и нужна. вроде везде имеется.
BratSinot
Сообщения: 812
ОС: Slackware64
Сообщение
BratSinot » 14.09.2009 07:36
alfss писал(а): ↑ 14.09.2009 01:30
#include <unistd.h>
unsigned int sleep(unsigned int seconds);
man 3 sleep
Код: Выделить всё
#include <unistd.h>
#include <stdio.h>
int main()
{
int x;
for (;;)
{
sleep(1);
x++;
printf("%d", x);
}
}
Код: Выделить всё
test.cpp In function 'int main()':
test.cpp:9: error: 'sleep' was not declared in the scope
Да видимо только либо самому писать либо по API функциям которые с системе привязаны.
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
drBatty » 14.09.2009 07:46
BratSinot писал(а): ↑ 14.09.2009 07:36
Да видимо только либо самому писать либо по API функциям которые с системе привязаны.
для такой тормозной команды может есть смысл system("sleep 1"); ?
lava
Сообщения: 155
ОС: archer
Сообщение
lava » 14.09.2009 07:57
Очень странно. применение в sleep() в основном цикле программы моветон, однако работать она должна. Просто откомпилировал Ваш код и запустил - всё отработало (разве только после printf() следует добавить fflush(NULL). И всегда было хорошо, сколько себя помню.
Кстати, ещё выдержка из man 3 sleep:
SLEEP(3) Linux Programmer's Manual SLEEP(3)
NAME
sleep - Sleep for the specified number of seconds
...
CONFORMING TO
POSIX.1-2001.
...
lava
Сообщения: 155
ОС: archer
Сообщение
lava » 14.09.2009 08:26
drBatty писал(а): ↑ 14.09.2009 07:46
для такой тормозной команды может есть смысл system("sleep 1"); ?
BratSinot писал(а): ↑ 13.09.2009 21:57
Короче на GCC что-бы работало и в GNU/Linux и во всяких MinGW.
Есть ли консольный sleep в оффтопике?
BratSinot
Сообщения: 812
ОС: Slackware64
Сообщение
BratSinot » 14.09.2009 08:28
lava писал(а): ↑ 14.09.2009 07:57
Просто откомпилировал Ваш код и запустил - всё отработало (разве только после printf() следует добавить fflush(NULL). И всегда было хорошо, сколько себя помню.
Не работает сколько себя помню =)
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
drBatty » 14.09.2009 13:29
lava писал(а): ↑ 14.09.2009 08:26
Есть ли консольный sleep в оффтопике?
вроде был. только у них он назывался PAUSE и работал либо n секунд, либо до нажатия любой кнопки.
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks
Сообщение
Alxn1 » 14.09.2009 13:49
lava
Сообщения: 155
ОС: archer
Сообщение
lava » 14.09.2009 14:00
drBatty писал(а): ↑ 14.09.2009 13:29
PAUSE и работал либо n секунд, либо до нажатия любой кнопки.
этот вроде выдаёт в консоль Press any key... и ждёт этой самой any key. Есс-но под задачу ни фига не подходит.
BratSinot
Сообщения: 812
ОС: Slackware64
Сообщение
BratSinot » 14.09.2009 14:17
Я теперь окончательно удостоверился что ничего нового в стандарт не вводили. Остается только самому написать только как это сделать? Ничего на ум не приходит.
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux
Сообщение
eddy » 14.09.2009 14:26
Можно еще select с NULL вместо файловых наборов.
Если же вам для мастдая - спросите на винфаке.
RTFM
-------
KOI8-R - патриотичная кодировка
BratSinot
Сообщения: 812
ОС: Slackware64
Сообщение
BratSinot » 14.09.2009 14:49
eddy писал(а): ↑ 14.09.2009 14:26
Если же вам для мастдая - спросите на винфаке.
Мне для всего.
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
drBatty » 14.09.2009 15:04
lava писал(а): ↑ 14.09.2009 14:00
этот вроде выдаёт в консоль Press any key... и ждёт этой самой any key. Есс-но под задачу ни фига не подходит.
ага...
значит нужно юзать маздаевский sleep, как писал
Alxn1
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux
Сообщение
watashiwa_daredeska » 14.09.2009 15:19
BratSinot писал(а): ↑ 14.09.2009 14:17
окончательно удостоверился что ничего нового в стандарт не вводили.
Вам нужен какой-то еще, кроме упомянутых мной трех?
BratSinot писал(а): ↑ 14.09.2009 14:49
Мне для всего.
Да, в стандарт на «всё», насколько мне известно, не внесли еще ни одной строчки ;)
BratSinot писал(а): ↑ 14.09.2009 14:17
Остается только самому написать только как это сделать? Ничего на ум не приходит.
Через #ifdef
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks
Сообщение
Alxn1 » 14.09.2009 16:39
Угу, через ifdef. Как-то так:
Код: Выделить всё
#ifdef WIN32
#include <windows.h>
#else
#include <unistd.h>
#endif
void MySleep( long ms )
{
#ifdef WIN32
Sleep( ms );
#else
usleep( ms * 1000 );
#endif
}
Надеюсь что даже размерности не перепутал, а то я все время теряюсь в этих нано/микро/миллисекундах
BratSinot
Сообщения: 812
ОС: Slackware64
Сообщение
BratSinot » 14.09.2009 16:58
/*Через #ifdef*/
А ну да точно. Вот как по проще и не сообразил. Я вас так понял если операционка Х то будем юзать ВремяХ, а если операционка Y то юзаем ВремяY?
bl00dl1nes
Сообщения: 115
ОС: ubuntu
Сообщение
bl00dl1nes » 14.09.2009 18:17
BratSinot писал(а): ↑ 14.09.2009 16:58
/*Через #ifdef*/
А ну да точно. Вот как по проще и не сообразил. Я вас так понял если операционка Х то будем юзать ВремяХ, а если операционка Y то юзаем ВремяY?
грубо говоря - да, по строкам же:
если определена переменная WIN32, то подключаем такой-то заголовочный файл
если не определена - то другой.
функция вроде как являеться оберткой, в теле которого используеться либо одна функция, либо другая (опять же зависит от определенных переменных)