powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Таймеры в C++
14 сообщений из 14, страница 1 из 1
Таймеры в C++
    #33912809
Belevern
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня возникла такая проблемка: пишу я проги на BCB6: там таймер создаётся с помощью VCL... А в консоли - никак. Вот, подскажите мне как создать таймер в C++ с использованием, желательно стандартных библиотек, чтобы туже самую прогу я смог скомпилить под VC и GCC... Очень нужно, пожалуйста помогите...
Заранее благодарен.
...
Рейтинг: 0 / 0
Таймеры в C++
    #33912897
Belevern
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть мне надо чтобы было примерно так:
Код: 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
Таймеры в C++
    #33914014
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понимаю - консольное приложение не сможет такой таймер поймать, ибо эти таймеры основаны на сообщении 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
Таймеры в C++
    #33914033
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
только это конечно никакие не "таймеры C++", а виндовые извраты.
Даже не знаю, существуют ли переносимые "таймеры С++", по-моему у него в библиотеках нету такого.
...
Рейтинг: 0 / 0
Таймеры в C++
    #33914113
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null--только это конечно никакие не "таймеры C++", а виндовые извраты.


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

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

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

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

А SetWaitableTimer создает совершенно другой вид таймеров, представляющий объект ядра NT Timer и поэтому должен хорошо работать и в безоконных приложениях. Действительно, он лучше.
...
Рейтинг: 0 / 0
Таймеры в C++
    #33914220
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--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
Таймеры в C++
    #33915746
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null--кcтати, библиотека Burst, которую обещают в стандартные включить - я ее к сожалению не изучил, но вроде там как раз должны быть разные переносимые решения, может быть и таймеры там реализованы?

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

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


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