Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Выполнение цикла while в течении 5 сек


Автор: kb64 12.9.2009, 19:46
Помогите реализовать, спасибо.

Автор: zim22 12.9.2009, 19:49
Sleep

Автор: kb64 12.9.2009, 19:59
дык слип вроде остановит цикл ?
А мне нужно чтобы скажем 
while(таймер < 5 секунд){

keybd_event('A', NULL, NULL, NULL);

}

Автор: Annihilator 12.9.2009, 20:32
ну что-нить типа
Код

    time_t seconds, localseconds;
    seconds = localseconds = time (NULL);
    while (localseconds - seconds < 5)
    {
        localseconds = time (NULL);
                keybd_event('A', NULL, NULL, NULL);
    }

надо подключить
Код

#include<ctime>

Автор: Fatkh 12.9.2009, 20:36
Код

clock_t start, cur;
double t = 0;
start = clock();

while (t < 5) {
    /* Code */
    cur = clock();
    t = (double)(cur - start) / (double)CLOCKS_PER_SEC;
}

Автор: Fatkh 12.9.2009, 20:54
Цитата(Annihilator @  12.9.2009,  18:32 Найти цитируемый пост)
Код
time_t seconds, localseconds;
    seconds = localseconds = time (NULL);
    while (localseconds - seconds < 5)
    {
        localseconds = time (NULL);
                keybd_event('A', NULL, NULL, NULL);
    }


А вот так писать нельзя. В стандарте ничего не написано о том, что time_t считается в секундах. Поэтому код будет выполняться неопределенное время.

Автор: Anikmar 12.9.2009, 21:10
Цитата(Fatkh @  12.9.2009,  20:54 Найти цитируемый пост)
А вот так писать нельзя. В стандарте ничего не написано о том, что time_t считается в секундах. Поэтому код будет выполняться неопределенное время. 


А что по стандарту возвращает функция time(NULL) ?

Автор: zim22 12.9.2009, 21:16
Цитата(Anikmar @  12.9.2009,  21:10 Найти цитируемый пост)
что по стандарту возвращает функция time(NULL) ?

в стандарте не нашёл информации, но http://programmersforum.ru/showthread.php?p=81289 написано, что
Цитата

Код

time_t time(time_t *timer);

The time function returns the number of seconds elapsed since midnight (00:00:00), January 1, 1970

Автор: Fatkh 12.9.2009, 21:43
Цитата(Anikmar @  12.9.2009,  19:10 Найти цитируемый пост)
А что по стандарту возвращает функция time(NULL) ? 

Что угодно. Переменную типа time_t. И все (кроме того, что time_t - арифметический тип). 
The range and precision of times representable in clock_t and time_t are implementation-defined.


Цитата(zim22 @  12.9.2009,  19:16 Найти цитируемый пост)
в стандарте не нашёл информации, но здесь написано, что
Цитата

код C++
1:
time_t time(time_t *timer);

The time function returns the number of seconds elapsed since midnight (00:00:00), January 1, 1970


Это верно для некоторых реализаций. К примеру, для DigitalMars это не так: "time returns the current time in seconds elapsed since 00:00:00 GMT on January 1, 1968..."
Так что об этом нельзя даже предполагать. Что там секунды, тоже не факт. time_t может быть числом с плавающей точкой, а там и округление может сработать не так, как вы предполагаете.

Добавлено через 7 минут и 16 секунд
Цитата

The time function returns the number of seconds elapsed since midnight (00:00:00), January 1, 1970


А это из стандарта POSIX. Но не стандарта С или С++.

Автор: bsa 13.9.2009, 00:08
Fatkh, прав:
Цитата(January 18 @  1999  WG14/N869)
       [#2] The time function determines the current calendar time.
       The encoding of the value is unspecified.

       Returns

       [#3] The time function  returns  the  implementation's  best
       approximation  to  the  current  calendar  time.   The value
       (time_t)-1  is  returned  if  the  calendar  time   is   not
       available.  If timer is not a null pointer, the return value
       is also assigned to the object it points to. 
Поэтому, чтобы узнать, сколько прошло секунд, нужно воспользоваться функцией difftime().

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

Добавлено через 2 минуты и 48 секунд
Цитата(Fatkh @ 12.9.2009,  21:43)
А это из стандарта POSIX. Но не стандарта С или С++.

Если честно, сам по себе язык Си был создан для написания на нем операционной системы UNIX. По которой уже и делали стандарт POSIX, если не ошибаюсь. Поэтому, тут как с типом char - в стандарте не сказано, что char == byte, но все это подразумевают.

Автор: Fatkh 13.9.2009, 01:01
Цитата(bsa @  12.9.2009,  22:08 Найти цитируемый пост)
Fatkh, прав:
Цитата(January 18 @  1999  WG14/N869)
       [#2] The time function determines the current calendar time.
       The encoding of the value is unspecified.

       Returns

       [#3] The time function  returns  the  implementation's  best
       approximation  to  the  current  calendar  time.   The value
       (time_t)-1  is  returned  if  the  calendar  time   is   not
       available.  If timer is not a null pointer, the return value
       is also assigned to the object it points to. 
Поэтому, чтобы узнать, сколько прошло секунд, нужно воспользоваться функцией difftime().

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

Добавлено через 2 минуты и 48 секунд
Цитата(Fatkh @ 12.9.2009,  21:43)
А это из стандарта POSIX. Но не стандарта С или С++.

Если честно, сам по себе язык Си был создан для написания на нем операционной системы UNIX. По которой уже и делали стандарт POSIX, если не ошибаюсь. Поэтому, тут как с типом char - в стандарте не сказано, что char == byte, но все это подразумевают. 


1. Для меня это само собой разумеется, это отнюдь не глубины языка. Для того, чтобы сказать, что main всегда возвращает тип int , тоже стандарт цитировать? К тому же то, что считаю более важным - "The range and precision of times representable in clock_t and time_t are implementation-defined." - я процитировал. Но принял к сведению - следующий раз приведу цитаты, мне не сложно.

2. С был написан для этого, но развился в главный язык встроенных систем и кроссплатформенной низкоуровневой разработки. Потому на Unix ориентироваться нельзя. К тому же Posix поддерживают не все. Боюсь, большая часть народа на творении мелкомягких сидит. Пример компилятора, не поддержвающего такую трактовку, я привел.

3. 
byte:
addressable unit of data storage large enough to hold any member of the basic character set of the execution environment
character:
single-byte character


Плюс 
A byte is composed of a contiguous sequence of bits, the number of which is implementation-defined. 

Но тут дело в другом. Я не знаю платформы, на которой выгодно было бы занимать под char часть байта. Вы тоже вряд ли. А функции времени - это уж как разработчику захочется.

Автор: Anikmar 13.9.2009, 10:50
В стандарте 99 про time_t ничего кроме перечисления его в типах не сказано.
А что говорит последний стандарт на выражение (time_t - time_t) - что будет в результате? Тоже неопределенность?

Интересно, нафига такой тип, которым непонятно как надо пользваться...

Автор: Fatkh 13.9.2009, 11:06
Цитата(Anikmar @  13.9.2009,  08:50 Найти цитируемый пост)
В стандарте 99 про time_t ничего кроме перечисления его в типах не сказано.
А что говорит последний стандарт на выражение (time_t - time_t) - что будет в результате? Тоже неопределенность?

Интересно, нафига такой тип, которым непонятно как надо пользваться... 


1. Значение будет типа time_t. 
2. Что значит непонятно? Для того, чтобы было понятно, есть библиотечные функции. Они предоставляют достаточный функционал. С типом вам  работать не нужно, работать нужно с функциями. Они  знают, что из себя представляет time_t.
3. А тип этот нужен потому, что С расчитан на многие платформы, и на какой-то удобнее реализовать time_t как double или char. Но функции определяют единый интерфейс работы с time_t и другими типами.

Автор: Anikmar 13.9.2009, 21:22
Цитата(Fatkh @  13.9.2009,  11:06 Найти цитируемый пост)
2. Что значит непонятно? Для того, чтобы было понятно, есть библиотечные функции. Они предоставляют достаточный функционал. С типом вам  работать не нужно, работать нужно с функциями. Они  знают, что из себя представляет time_t.
3. А тип этот нужен потому, что С расчитан на многие платформы, и на какой-то удобнее реализовать time_t как double или char. Но функции определяют единый интерфейс работы с time_t и другими типами.

Ну да, в общем-то интерфесные функции есть, я согласен.

Просто непривычно иметь дело с С++ и не знать внутренности типов  smile . Я с time_t как-то вообще ни разу не сталкивался - не было нужды, вот и заинтересовался.

Спасибо за информацию.


Автор: ASMatic 14.9.2009, 02:10
я бы организовал по другому:

Код

BOOL    timer = TRUE;

void main( void ) 
{

     SetTimer(....,Timer1, 5000, TimerProc );
 
     MyFunc();
}

void MyFunc( void )
{

    while (timer) {

            keybd_event('A', NULL, NULL, NULL);
    }

}

void TimerProc( void )
{
    timer = FALSE;
    KillTimer (Timer1 );
}


"лишняя" ф-я, но зато чистенько на апи + однозначно 5 сек.

Добавлено через 3 минуты и 22 секунды
ну и еще в цикл while желательно  добавить Sleep(50)  или больше чуток, все зависит от того насколько точно надо отсчитать 5сек, а то процессор загрузишь на 50% по другому...

Автор: mrbrooks 14.9.2009, 09:37
Цитата(ASMatic @  14.9.2009,  02:10 Найти цитируемый пост)
я бы организовал по другому:

автор ни чего про WinAPI не говорил  smile Поэтому думаю надо исходить из кроссплатформенных решений. Безусловно использование таймера - кошерный выход.

Автор: ller 14.9.2009, 09:41
Так таймеры есть под все платформы.  smile Про микроконтроллеры не знаю, но думаю тут не о них речь. 

Автор: Zerstroer 21.9.2009, 12:04
Решаю сходную задачу. Прошу помочь.
Требуется выполнение события по таймеру. 
При этом нежелательна прогонка пустых циклов, так как важнее не точность, а минимальная загрузка процессора и памяти. Пишу консольное приложение под UNIX. (g++).
Fatkh был предложен достаточно изящный алгоритм, но не совсем подходит, так как имеет место прогонка цикла (while).
Цитата

   double t = 0;
    start = clock();
    int n = 0;
    while (t < 5) {
    /* Code */
            cur = clock();
            t = (double)(cur - start) / (double)CLOCKS_PER_SEC;
        }

Что можете предложить/посоветовать?

Автор: xvr 21.9.2009, 12:07
Цитата(Zerstroer @ 21.9.2009,  12:04)
Требуется выполнение события по таймеру. 
При этом нежелательна прогонка пустых циклов, так как важнее не точность, а минимальная загрузка процессора и памяти. Пишу консольное приложение под UNIX. (g++).

Что можете предложить/посоветовать?

sleep, nanosleep, alarm, select
 

Автор: Zerstroer 21.9.2009, 12:33
Спасибо! Почему-то думал, что sleep - требует виндузовскую <dos.h>. Спасибо за наставление на путь истинный. Все гиперпросто оказалось! smile 

Автор: ller 21.9.2009, 16:15
http://www.freesource.info/wiki/Stat%27i/KratkoOboVsjom/Clang/part2/part4&

Автор: SVN74 21.9.2009, 18:10
DWORD D = GetTickCount();
do
{
 //Бла, Бла, Бла (5 сек) 
}while((GetTickCount()-D)<5000);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)