Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Таймер


Автор: Гость_PriZraK 10.11.2005, 19:29
Мне необходиом, чтобы определенная функция вызывалась каждую секунду. Пожалуйста подскажите как это сделать???

Автор: _hunter 10.11.2005, 19:45
ты угадал. с помощью таймера ( SetTimer() )

Автор: powerfox 10.11.2005, 20:46
В Страуструпе не нашёл, из какой библиотеки ф-я?

Автор: cardinal 10.11.2005, 21:20
Цитата(MSDN)
CWnd::SetTimer
UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );

Return Value

The timer identifier of the new timer if the function is successful. An application passes this value to the KillTimer member function to kill the timer. Nonzero if successful; otherwise 0.

Parameters

nIDEvent

Specifies a nonzero timer identifier.

nElapse

Specifies the time-out value, in milliseconds.

lpfnTimer

Specifies the address of the application-supplied TimerProc callback function that processes the WM_TIMER messages. If this parameter is NULL, the WM_TIMER messages are placed in the application’s message queue and handled by the CWnd object.

Remarks

Installs a system timer. A time-out value is specified, and every time a time-out occurs, the system posts aWM_TIMER message to the installing application’s message queue or passes the message to an application-defined TimerProc callback function.

The lpfnTimer callback function need not be named TimerProc, but it must be defined as follows:

void CALLBACK EXPORT TimerProc(
  HWND hWnd,      // handle of CWnd that called SetTimer
  UINT nMsg,      // WM_TIMER
  UINT nIDEvent  // timer identification
  DWORD dwTime    // system time
);

Timers are a limited global resource; therefore it is important that an application check the value returned by the SetTimer member function to verify that a timer is actually available.



Автор: Neitron 11.11.2005, 10:31

Не факт что у него Visual C++
и уродский MFC.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/timers/timerreference/timerfunctions/settimer.asp

Автор: Любитель 11.11.2005, 11:17
Пишем функцию, которая будет периодически вызываться, вызываем
Код

if (!SetTimer(0,0,miliseconds,lpFunc)) //lpFunc - указатель на нашу функцию 
 // что-то обламалось с таймером;
 //  функция вида (парметры):
VOID CALLBACK TimerProc( HWNd, UINT, UINT_PTR,  DWORD dwTime);

Подробно - MSDN. Функция из WinAPI (#include <windows.h>)

Автор: powerfox 11.11.2005, 14:02
А из STL усть что-нибудь, а то у меня Linux(g++-3.4.1). Мне потом надо будет и под Windows скомпайлить, но не очень скоро.
Может как-то иначе реализовать счётчик времени выполнения приложения(игра Snake, требуется секундомер)?

Автор: Neitron 11.11.2005, 14:11
powerfox
Цикл?

Автор: Гость_malysh 12.11.2005, 21:15
Пишу арканоид на Dev-Сpp. Не знаю как отслеживать время(ну чтобы шарик нормально летал).

Автор: Guest 12.11.2005, 22:04
Создовайт цикл, и в цикле смотри текущее время, посмотри в линухе аналог Sleep, или полюбому в никсах должна быть ф-ция таймера.

Автор: powerfox 12.11.2005, 22:41
в Linux - setitimer()
http://www.die.net/doc/linux/man/man2/setitimer.2.html

Автор: powerfox 17.11.2005, 21:03
Не смог разобраться как работает setitmer - где задавать имя вызываемой ф-ии? Может кто покажет пример(hello world c таймером)? smile

Автор: Mayk 17.11.2005, 21:08
powerfox
а может тебе воспользоваться сигналами?

Цитата(alarm)

NAME
      alarm - set an alarm clock for delivery of a signal

SYNOPSIS
      #include <unistd.h>

      unsigned int alarm(unsigned int seconds);

DESCRIPTION
      alarm  arranges  for a SIGALRM signal to be delivered to the process in
      seconds seconds.

      If seconds is zero, no new alarm is scheduled.

      In any event any previously set alarm is cancelled.

RETURN VALUE
      alarm returns the number of  seconds  remaining  until  any  previously
      scheduled alarm was due to be delivered, or zero if there was no previ-
      ously scheduled alarm.


Только афаир alarm со sleep'ом плохо сочетаются
Добавлено @ 21:09
А хотя в принципе один фиг. setitimer тоже sigalrm посылает smile

Автор: Mayk 17.11.2005, 21:21
Вот пример - первый выстрел таймера происходит по alarm'у, другие по setitimer.
Код

#include <unistd.h>
#include <signal.h>
#include <sys/time.h>

void myalarm(int a)
{
        if(a == SIGALRM){
                struct itimerval v1;
                v1.it_interval.tv_sec = 0;
                v1.it_interval.tv_usec = 500000;
                v1.it_value.tv_sec = 0;
                v1.it_value.tv_usec = 1;
                if(setitimer(ITIMER_VIRTUAL, &v1,&v1));
                        perror("setitimer");
        }
        printf("hello world\n");
}

int main()
{
        signal(SIGALRM, myalarm);
        signal(SIGVTALRM, myalarm);
        alarm(1);
        while(1);

}

Автор: powerfox 17.11.2005, 21:41
Не дадите несколько пояснений, что происходит(строки 21-24, 13, 14)

Автор: Mayk 17.11.2005, 22:00
Ну примерно так это выглядит:
Цитата(powerfox @ 18.11.2005, 01:41)
21-24


Установка обработчиков сигнала. SIGALRM генерируется alarm, по прошествии указанного кол-ва секунд.
SIGVTALRM - setitimer'ом.
При генерации сигнала могут произойти следующие вещи - сигнал может быть проигнорирован, и мы о нём не узнаем. Приложение будет работать так как будто сигнала не было.
Приложение может быть нагло убито(и мы об этом не узнаем - что нас убивают).
Или может быть вызван пользовательский обработчик сигналов. Управление передастся обработчику сигнала, приложение продолжит работу. Кстати,
Цитата(signal)

The effects of this call in a multi-threaded process are unspecified.


Что собственно мы и хотим. В качестве аргумента обработчик получает номер сигнала

Подробнее смотреть в signal(2), signal(7), alarm(2), sigaction(2).


Цитата(powerfox @ 18.11.2005, 01:41)
13, 14

13 - установка таймера. Каждые пол секунды (кажется) приложение будет получать SIGVTALRM. ITIMER_VIRTUAL выбран для того, чтоб приложение получало нечто отличное от SIGALRM.
14 - perror просто для отладочных целей - всё ли передано правильно.

Подробнее смотреть setitimer(2), perror(3)

Автор: powerfox 17.11.2005, 22:07
Спасибо, буду разбираться.

Автор: S.A.P. 18.11.2005, 08:12
powerfox Если ты используешь SDL, то там вроде свой таймер есть, переносимый.

Автор: powerfox 18.11.2005, 16:30
To Perchilla:
Огромное спасибо! Наверное, даже в том туториале описан этот таймер - поищу, когда снова будет время. smile smile
Добавлено @ 16:36
Цитата(Mayk @ 17.11.2005, 22:00)
сигнала могут произойти следующие вещи - сигнал может быть проигнорирован, и мы о нём не узнаем. Приложение будет работать так как будто сигнала не

Реально работает. Похоже на события, обсуждаемые в соседней ветке.
Нашёл сигнал выдаваемый по нажатию клавиши. Можно совместить с getchar(), чтобы получать код клавиши в GUI приложении. SDL обработчик мне не очень нравится - но других я не знаю?(не буквы)

Автор: leniviy 10.2.2011, 11:25
Цитата(Mayk @  17.11.2005,  21:21 Найти цитируемый пост)
первый выстрел таймера происходит по alarm'у, другие по setitimer.

Обязательно вызывать alarm(1) ? У меня и без него работает, если я выставляю it_value = 1мкс и it_interval = 1с

Автор: cardinal 11.2.2011, 00:02
leniviy, ты видел сколько лет теме? smile 

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