![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 92 |
gepard
Да, эта функция есть только в VC++ .NET. И точность у неё около 16мс. GetTickCount() тоже даёт точность только ~16мс ![]() Можете проверить сами, записывая в файл в цикле значения, полученные из этих функций. Я уже с этим не раз сталкивался -- в Windows ничего особо толкового не получится. Миллион раз уже тут писал, что нужно пользоваться QueryPerformanceCounter -- поищите по форуму. Самый примитивный способ, использующий эту функцию:
Цикл закончится, когда пройдёт интервал в 0.003 секунды -- с точностью до скорости выполнения команды. Недостаток -- грузит проц на 100% для больших интервалов. Это сообщение отредактировал(а) Дрон - 2.7.2004, 05:46 -------------------- Да. Именно так. |
|||
|
||||
bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
запись в файл не показатель. В цикле писать в файл и потом удивляться, что GetTickCount() выдает сумашедшие результаты . Оригинально ![]() ![]() В винде, как знаю еще есть CreateWaitableTimer. Только не знаю она его в нулевой интерапт встраивает или нет. И как запрограммирован таймер в винде? Это сообщение отредактировал(а) bel_nikita - 2.7.2004, 00:04 |
|||
|
||||
Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 92 |
bel_nikita
Ты не правильно меня понял ![]() Результаты записи в файл были примерно такие:
За эти 15мс прога успевала записать строку в файл "несколько сотен раз" ![]() Если не веришь, то вот другой простой тест:
Тут зависит от быстродействия компа. Уменя Athlon XP 2500+. Результаты При N = 100000 - 15 мс: 24%, 16 мс: 35%, 31 мс: 29%, 32 мс: 12% При N = 50000 - 0 мс: 29%, 15 мс: 26%, 16 мс: 45% При N = 25000 - 0 мс: 64%, 15 мс: 14%, 16 мс: 22% Я знал, что AMD делает крутые процессоры, но то что они в 64% случаях могут вычислить 25000 сложных математических операций вообще не потратив на это времени -- это уже действительно круто! ![]() ![]() ![]() WaitableTimer может быть и полезен. Как и Sleep ![]() Только на любой из методов будут очень сильно влиять другие процессы и потоки. ЗЫ: Подсветка синтаксиса моя -- экспериментальная ![]() Это сообщение отредактировал(а) Дрон - 2.7.2004, 05:48 -------------------- Да. Именно так. |
||||
|
|||||
bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Дрон - это совсем не то. Это замер времени выполнения. Причем грубый и не отражающий реальное быстродействие процессора. А не задумывались, сколько раз во время цикла происходят переключения на другие thread'ы?. Что-то я отвлекся
![]() |
|||
|
||||
kruchinin |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 19.4.2003 Репутация: нет Всего: нет |
Почитайте обычный help Borlandа 5.0
Стандартные функции GetTickCount или QueryPerformanceCounter, QueryPerformanceFrequency я не понимаю какие могут быть проблемы - эти функции работают с частотой процессора. |
|||
|
||||
bel_nikita |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
kruchinin
![]() ![]()
Мы люди темные. Help'ы к борланду не читали. Если у вас все так просто, привидите пожалуйста пример реализации таймера под Виндой, который будет срабатывать менее чем 3мсек ![]() |
||||
|
|||||
Олег М |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
А как насчёт мсдн?
К сожалению пока не могу, но так, теоретически, по моему в виндах процессы переключаются намного чаще чем раз в 1 мс. Почему бы нет? |
||||
|
|||||
kruchinin |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 19.4.2003 Репутация: нет Всего: нет |
Вот код из моей игры Танки 3:
system_a=true;//переменная для выхода из системы // в игре я не посылаю сообщение WM_QUIT, а просто меняю переменную freg1=GetTickCount(); for_fps=0;//вычисление FPS tick=false;//произошло ли событие таймера while (true) { //обработка сообщений if (PeekMessage(&Msg,NULL,0,0,PM_REMOVE)) { if (Msg.message == WM_QUIT) break; TranslateMessage(&Msg); DispatchMessage(&Msg); } else ; //вызов таймера if (system_a) { if (tick) {//если нужное время прошли - рисуем картинки None(hWnd); tick=false; } freg2=GetTickCount(); if (freg2-freg1>1000/_TIMER_) {//определяем нужное время _TIMER_ - задать это время tick=true; for(i=freg2-freg1;i>1000/_TIMER_;i-=1000/_TIMER_) { for(j=0;j<_TIMER_-1;j++) fps_a[j]=fps_a[j+1]; fps_a[_TIMER_-1]=for_fps;//ну это не важно просто для измерения FPS в игре for_fps=0; fps=0; for(j=0;j<_TIMER_;j++) fps+=fps_a[j]; OnTimer(hWnd);//вызываем событие таймера } freg1=GetTickCount()-i; //выход из игры if (Exit_Game) PostMessage(hWnd,WM_DESTROY,0,0); } } } |
|||
|
||||
Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
Танки - это круто
![]() |
|||
|
||||
Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 92 |
Ну ладно. Забили ![]() Раз нужен таймер -- получайте (работает только в Windows NT/2K/XP, т.к. в 95/98/Me нет функции CreateWaitableTimer()):
Ничего более хорошего тут уже ИМХО не добиться. Это сообщение отредактировал(а) Дрон - 2.7.2004, 17:37 -------------------- Да. Именно так. |
||||
|
|||||
Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
Ну а как ты хотел. Другим потокам-то тоже нужно время чтобы переключаться и работать - на забывай винды нифига не система реального времени. Вот и получается меньше. Вот если бы больше!!!! А цифры такие же остаются или скачут постоянно? |
|||
|
||||
Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 92 |
Никак не хотел. Я всё это давно знаю ![]() Цифры такие же плюс-минус 1. Тяжёлых фоновых приложений не было -- иначе б скакали ![]() -------------------- Да. Именно так. |
|||
|
||||
Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
Дрон
Тогда всё нормально. Надо подсчитать чистое время, которое выполняется твой поток и всё наверняка сойдётся |
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
К примеру (а если еще это в отдельный поток - то тогда то что надо
![]() Причем этот код не зависит от производительности процессора ![]()
Это сообщение отредактировал(а) zss - 6.7.2004, 12:30 |
|||
|
||||
Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
Нифига себе! Это ещё круче танков!
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |