Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Таймеры в C++ / 14 сообщений из 14, страница 1 из 1
11.08.2006, 12:07
    #33912809
Belevern
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таймеры в C++
У меня возникла такая проблемка: пишу я проги на BCB6: там таймер создаётся с помощью VCL... А в консоли - никак. Вот, подскажите мне как создать таймер в C++ с использованием, желательно стандартных библиотек, чтобы туже самую прогу я смог скомпилить под VC и GCC... Очень нужно, пожалуйста помогите...
Заранее благодарен.
...
Рейтинг: 0 / 0
11.08.2006, 12:27
    #33912897
Belevern
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таймеры в C++
То есть мне надо чтобы было примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void CALLBACK _export TimerProc(HWND hwnd, UINT msg, UINT idTimer, DWORD dwTime){
printf("time\n");
}

void main(){
int nTimerID = SetTimer(NULL,  0 ,  1000 , (TIMERPROC)TimerProc);
getch();
}
Но такой код не пашет. :-(
...
Рейтинг: 0 / 0
11.08.2006, 17:26
    #33914014
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таймеры в C++
Если я правильно понимаю - консольное приложение не сможет такой таймер поймать, ибо эти таймеры основаны на сообщении WM_TIMER и требуют наличия у программы цикла обработки сообщений Windows.

Например, делают такие извраты:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
#define STRICT  1  
#include <windows.h>
#include <iostream.h>

VOID CALLBACK TimerProc(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime) {
cout << "Time: " << dwTime << '\n';
cout.flush();
}

int main(int argc, char *argv[], char *envp[]) {
	int Counter= 0 ;
	MSG Msg;
UINT TimerId = SetTimer(NULL,  0 ,  500 , &TimerProc);
cout << "TimerId: " << TimerId << '\n';
if (!TimerId)
	return  16 ;
while (GetMessage(&Msg, NULL,  0 ,  0 )) {
	++Counter;
	if (Msg.message == WM_TIMER)
		cout << "Counter: " << Counter << "; timer message\n";
	else
		cout << "Counter: " << Counter << "; message: " << Msg.message << '\n';
	DispatchMessage(&Msg);
	}
KillTimer(NULL, TimerId);
return  0 ;
}


А вообще в консольной проге можно использовать timeSetEvent из Multimedia API, но как ни странно он вполне пригоден и для других задач
...
Рейтинг: 0 / 0
11.08.2006, 17:32
    #33914033
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таймеры в C++
только это конечно никакие не "таймеры C++", а виндовые извраты.
Даже не знаю, существуют ли переносимые "таймеры С++", по-моему у него в библиотеках нету такого.
...
Рейтинг: 0 / 0
11.08.2006, 18:08
    #33914113
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таймеры в C++
--null--только это конечно никакие не "таймеры C++", а виндовые извраты.


С точки зрения извратов - в качестве таймера можно использовать поток. Так, кстати, я реализовал класс таймера в линухах. потоку по трубам кидают новые и убиваемые таймеры, а он в своем векторе их обрабатывает. Вполне нормальный изврат. Тем более, что не благодарное дело связываеть с SIG_ACTION.

Кстати, а ты какой таймер в линухах пользуешь?
...
Рейтинг: 0 / 0
11.08.2006, 18:41
    #33914184
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таймеры в C++
про потоки - совершенно согласен. Можно действительно сделать отличный таймер.
В линухе - я человек скромный, мне достаточно alarm()
...
Рейтинг: 0 / 0
11.08.2006, 18:45
    #33914188
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таймеры в C++
кcтати, библиотека Burst, которую обещают в стандартные включить - я ее к сожалению не изучил, но вроде там как раз должны быть разные переносимые решения, может быть и таймеры там реализованы?
...
Рейтинг: 0 / 0
11.08.2006, 18:48
    #33914199
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таймеры в C++
--null--Если я правильно понимаю - консольное приложение не сможет такой таймер поймать, ибо эти таймеры основаны на сообщении WM_TIMER и требуют наличия у программы цикла обработки сообщений Windows.Неправильно понимаешь. Вот как раз чтобы не нужно было сидеть в цикле обработки сообщений колбеки и придуманы.

Для Belevern: А вот ты все правильно понимаешь :)
В твоем примере, вместо SetTimer() надо использовать функцию SetWaitableTimer() ее четвертый параметр как раз адрес колбека. Будет работать точно по тому принципу который ты хочешь.
...
Рейтинг: 0 / 0
11.08.2006, 18:51
    #33914200
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таймеры в C++
White Owl а почему у него не работал таймер SetTimer?
...
Рейтинг: 0 / 0
11.08.2006, 18:58
    #33914214
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таймеры в C++
вроде врубился.

SetTimer я правильно понимаю - он действительно на WM_TIMER работает поэтому не пашет в том виде, как привел в примере автор.

А SetWaitableTimer создает совершенно другой вид таймеров, представляющий объект ядра NT Timer и поэтому должен хорошо работать и в безоконных приложениях. Действительно, он лучше.
...
Рейтинг: 0 / 0
11.08.2006, 19:02
    #33914220
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таймеры в C++
--null--White Owl а почему у него не работал таймер SetTimer?Потому что SetTimer() завязан на WM_TIMER. Читай MSDN:
MSDN:SetTimerWhen you specify a TimerProc callback function, the default window procedure calls the callback function when it processes WM_TIMER. Therefore, you need to dispatch messages in the calling thread, even when you use TimerProc instead of processing WM_TIMER.
То есть, если используешь SetTimer с колбеком, то это колбек будет вызван внутри DefWindowProc().
...
Рейтинг: 0 / 0
14.08.2006, 11:13
    #33915746
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таймеры в C++
--null--кcтати, библиотека Burst, которую обещают в стандартные включить - я ее к сожалению не изучил, но вроде там как раз должны быть разные переносимые решения, может быть и таймеры там реализованы?

Хотелось бы взглянуть на эту библиотеку. Может ссылку?
...
Рейтинг: 0 / 0
14.08.2006, 12:15
    #33915999
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таймеры в C++
Бибилиотека называется кстати Boost www.boost.org
...
Рейтинг: 0 / 0
14.08.2006, 12:25
    #33916033
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таймеры в C++
Какой же это таймер? Это просто контейнер для подсчета промежутков времени!

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
//  boost timer.hpp header file  ---------------------------------------------//

//  Copyright Beman Dawes 1994-99.
//  See accompanying license for terms and conditions of use.

//  See http://www.boost.org/libs/timer for documentation.

//  Revision History
//  01 Apr 01  Modified to use new <boost/limits.hpp> header. (JMaddock)
//  12 Jan 01  Change to inline implementation to allow use without library
//             builds. See docs for more rationale. (Beman Dawes) 
//  25 Sep 99  elapsed_max() and elapsed_min() added (John Maddock)
//  16 Jul 99  Second beta
//   6 Jul 99  Initial boost version

#ifndef BOOST_TIMER_HPP
#define BOOST_TIMER_HPP

#include <boost/config.hpp>
#include <ctime>
#include <boost/limits.hpp>

# ifdef BOOST_NO_STDC_NAMESPACE
    namespace std { using ::clock_t; using ::clock; }
# endif


namespace boost {

//  timer  -------------------------------------------------------------------//

//  A timer object measures elapsed time.

//  It is recommended that implementations measure wall clock rather than CPU
//  time since the intended use is performance measurement on systems where
//  total elapsed time is more important than just process or CPU time.

//  Warnings: The maximum measurable elapsed time may well be only 596.5+ hours
//  due to implementation limitations.  The accuracy of timings depends on the
//  accuracy of timing information provided by the underlying platform, and
//  this varies a great deal from platform to platform.

class timer
{
 public:
         timer() { _start_time = std::clock(); } // postcondition: elapsed()==0
//         timer( const timer& src );      // post: elapsed()==src.elapsed()
//        ~timer(){}
//  timer& operator=( const timer& src );  // post: elapsed()==src.elapsed()
  void   restart() { _start_time = std::clock(); } // post: elapsed()==0
  double elapsed() const                  // return elapsed time in seconds
    { return  double(std::clock() - _start_time) / CLOCKS_PER_SEC; }

  double elapsed_max() const   // return estimated maximum value for elapsed()
  // Portability warning: elapsed_max() may return too high a value on systems
  // where std::clock_t overflows or resets at surprising values.
  {
    return (double(std::numeric_limits<std::clock_t>::max())
       - double(_start_time)) / double(CLOCKS_PER_SEC); 
  }

  double elapsed_min() const            // return minimum value for elapsed()
   { return double( 1 )/double(CLOCKS_PER_SEC); }

 private:
  std::clock_t _start_time;
}; // timer

} // namespace boost

#endif  // BOOST_TIMER_HPP

...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Таймеры в C++ / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]