C/C++ время

Модератор: Модераторы разделов

BratSinot
Сообщения: 812
ОС: Slackware64

C/C++ время

Сообщение BratSinot »

Вопрос: Какой код можно написать чтоб функция срабатывала через определенное время. Поясняю:

Код: Выделить всё

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

Re: C/C++ время

Сообщение watashiwa_daredeska »

man sleep
man usleep
man nanosleep
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: C/C++ время

Сообщение nesk »

а можно еще man alarm
Это полезно, что бы в рамках одного процесса выполнять какой то код и периодически вызывает еще какую то функцию.
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Аватара пользователя
Cra3y
Сообщения: 80
ОС: Debian

Re: C/C++ время

Сообщение Cra3y »

В аттаче примерчик на 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

Re: C/C++ время

Сообщение BratSinot »

А sleep это разве стандарт? Я что-то не нашел заголовка или что-то похожее. Это не Борланд случаем? Если он то у него есть delay. А мне надо на стандартах C89 и C++. Короче на GCC что-бы работало и в GNU/Linux и во всяких MinGW.
Спасибо сказали:
alfss
Сообщения: 262

Re: C/C++ время

Сообщение alfss »

#include <unistd.h>

unsigned int sleep(unsigned int seconds);

man 3 sleep
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: C/C++ время

Сообщение drBatty »

BratSinot писал(а):
13.09.2009 21:43
Пробовал через clock(). Мол:

ага
The clock() function returns an approximation of processor time used by the program.

потому используйте sleep, она для этого и нужна. вроде везде имеется.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: C/C++ время

Сообщение BratSinot »

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

Re: C/C++ время

Сообщение drBatty »

BratSinot писал(а):
14.09.2009 07:36
Да видимо только либо самому писать либо по API функциям которые с системе привязаны.

для такой тормозной команды может есть смысл system("sleep 1"); ?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
lava
Сообщения: 155
ОС: archer

Re: C/C++ время

Сообщение lava »

Очень странно. применение в 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

Re: C/C++ время

Сообщение lava »

drBatty писал(а):
14.09.2009 07:46
для такой тормозной команды может есть смысл system("sleep 1"); ?

BratSinot писал(а):
13.09.2009 21:57
Короче на GCC что-бы работало и в GNU/Linux и во всяких MinGW.

Есть ли консольный sleep в оффтопике?
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: C/C++ время

Сообщение BratSinot »

lava писал(а):
14.09.2009 07:57
Просто откомпилировал Ваш код и запустил - всё отработало (разве только после printf() следует добавить fflush(NULL). И всегда было хорошо, сколько себя помню.


Не работает сколько себя помню =)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: C/C++ время

Сообщение drBatty »

lava писал(а):
14.09.2009 08:26
Есть ли консольный sleep в оффтопике?

вроде был. только у них он назывался PAUSE и работал либо n секунд, либо до нажатия любой кнопки.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: C/C++ время

Сообщение Alxn1 »

http://msdn.microsoft.com/en-us/library/ms686298(VS.85).aspx

Есть там sleep. Немного другой, правда, но есть.
Спасибо сказали:
Аватара пользователя
lava
Сообщения: 155
ОС: archer

Re: C/C++ время

Сообщение lava »

drBatty писал(а):
14.09.2009 13:29
PAUSE и работал либо n секунд, либо до нажатия любой кнопки.

этот вроде выдаёт в консоль Press any key... и ждёт этой самой any key. Есс-но под задачу ни фига не подходит.
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: C/C++ время

Сообщение BratSinot »

Я теперь окончательно удостоверился что ничего нового в стандарт не вводили. Остается только самому написать только как это сделать? Ничего на ум не приходит.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: C/C++ время

Сообщение eddy »

Можно еще select с NULL вместо файловых наборов.
Если же вам для мастдая - спросите на винфаке.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: C/C++ время

Сообщение BratSinot »

eddy писал(а):
14.09.2009 14:26
Если же вам для мастдая - спросите на винфаке.


Мне для всего.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: C/C++ время

Сообщение drBatty »

lava писал(а):
14.09.2009 14:00
этот вроде выдаёт в консоль Press any key... и ждёт этой самой any key. Есс-но под задачу ни фига не подходит.

ага...
значит нужно юзать маздаевский sleep, как писал Alxn1
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: C/C++ время

Сообщение watashiwa_daredeska »

BratSinot писал(а):
14.09.2009 14:17
окончательно удостоверился что ничего нового в стандарт не вводили.
Вам нужен какой-то еще, кроме упомянутых мной трех?

BratSinot писал(а):
14.09.2009 14:49
Мне для всего.
Да, в стандарт на «всё», насколько мне известно, не внесли еще ни одной строчки ;)

BratSinot писал(а):
14.09.2009 14:17
Остается только самому написать только как это сделать? Ничего на ум не приходит.
Через #ifdef
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: C/C++ время

Сообщение Alxn1 »

Угу, через 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

Re: C/C++ время

Сообщение BratSinot »

/*Через #ifdef*/
А ну да точно. Вот как по проще и не сообразил. Я вас так понял если операционка Х то будем юзать ВремяХ, а если операционка Y то юзаем ВремяY?
Спасибо сказали:
bl00dl1nes
Сообщения: 115
ОС: ubuntu

Re: C/C++ время

Сообщение bl00dl1nes »

BratSinot писал(а):
14.09.2009 16:58
/*Через #ifdef*/
А ну да точно. Вот как по проще и не сообразил. Я вас так понял если операционка Х то будем юзать ВремяХ, а если операционка Y то юзаем ВремяY?

грубо говоря - да, по строкам же:

Код: Выделить всё

#ifdef WIN32
    #include <windows.h>

если определена переменная WIN32, то подключаем такой-то заголовочный файл

Код: Выделить всё

#else
    #include <unistd.h>
#endif

если не определена - то другой.

функция вроде как являеться оберткой, в теле которого используеться либо одна функция, либо другая (опять же зависит от определенных переменных)
Спасибо сказали: