![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
decembrist |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 1.4.2004 Репутация: нет Всего: нет |
Столкнулся с проблемой на SetTimer-е. Период в милисекундах необходимо установить от 1 до 3 мс. Когда я пишу SetTimer(1,1,0); или SetTimer(1,3,0); у меня программа работает с той же скоростью что и при SetTimer(1,10,0); (при 10 мс) Что 10 мс минимальное значение? Можно как- нибудь ускорить работу программы?
![]() |
|||
|
||||
Конструктор |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 641 Регистрация: 12.5.2004 Где: Москва Репутация: нет Всего: 10 |
Дык по идее по таймерам всегда и пишут, что они неточные. А на таких маленьких интервалах и подавно. Вот секунды они могут более менее отработать, а миллисекунды. У винды наверное кванты времени для процессов и то больше.
|
|||
|
||||
Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
Есть ещё мультимедиа-таймеры посмотри подробнее в МСДН или
http://msdn.microsoft.com/library/default...._resolution.asp |
|||
|
||||
decembrist |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 1.4.2004 Репутация: нет Всего: нет |
А как мне тогда скорость увеличить?
Добавлено @ 13:26 Таймеры посмотрел - не получается |
|||
|
||||
gepard |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2477 Регистрация: 29.2.2004 Репутация: 2 Всего: 40 |
Я не понял, тебе надо отследить период в 3 милисекунды?
-------------------- Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным! © Я, Берсерк, что значит - Неистовый. |
|||
|
||||
decembrist |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 1.4.2004 Репутация: нет Всего: нет |
Да.
|
|||
|
||||
Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
Сделай в отдельном потоке безо всяких таймеров. Там не будет тормозить
|
|||
|
||||
decembrist |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 1.4.2004 Репутация: нет Всего: нет |
Я новичок никогда потоков не создавал Как это делается
![]() |
|||
|
||||
Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
А тебе что конкретно нужно сделать?
|
|||
|
||||
chipset |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 164 |
Да не... Вряд ли что то получится, Windows система нереального времени
![]() Так что переходим на линух, все... ![]() --------------------
|
|||
|
||||
Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
В виндах тоже всё прекрасно работает. Непонятно только причём здесь реальное время и с какой радости линух стал системой реального времени? |
|||
|
||||
chipset |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 164 |
Да но такие маалюююсенькие периоды времени стандартными средствами отследить не получится, если вообще получится...
Может я ошибаюсь? ![]() --------------------
|
|||
|
||||
Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
Ошибаешься. Я сейчас точно не вспомню, там где-то есть таймеры высокого разрешения и даже, по-моему потоки можно останавливать на время меньше 1 мс. Когда-то интересовался - потом забыл. |
|||
|
||||
gepard |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2477 Регистрация: 29.2.2004 Репутация: 2 Всего: 40 |
Я вот только не помню .millisec ли он называется(аргумент сруктуры) ![]() Ещё нужна версия time.h и timeb.h не старая(у меня в VC++ 6.0: timeb - нету, а time - старая). В VC++ .NET(2002) точно всё есть. -------------------- Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным! © Я, Берсерк, что значит - Неистовый. |
|||
|
||||
bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
GetTickCount() - нам поможет
![]()
![]() ![]() |
|||
|
||||
Дрон |
|
|||
![]() 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 |
Нифига себе! Это ещё круче танков!
|
|||
|
||||
decembrist |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 1.4.2004 Репутация: нет Всего: нет |
Что это за ф-ция GetTickCount()?
|
|||
|
||||
bel_nikita |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
zss К чему это? Надо же таймер >3 мсек.
Олег М
проясняем функцию GetTickCount() |
||||
|
|||||
decembrist |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 1.4.2004 Репутация: нет Всего: нет |
Подскажите "чайнику" как это сделать
|
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
Это было к примеру А если надо, то задай сколько тебе надо в tm_delay() ![]() |
|||
|
||||
Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
По моему, система реального времени - это такая система, где время выполнения любой операции жёстко определено (по максимуму). |
|||
|
||||
Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 92 |
zss
Так там же минимальный интервал это 1 тик = 1/18.2 секунды = 56 мс. Многовато... bel_nikita
Вот тут можно почитать: http://www.cvalka.net/hack/read.php?file=20&dir= Windows однозначно НЕ является операционной системой реального времени. Добавлено @ 17:05 decembrist А что класс WaitableTimer, приведённый мной, не подходит? -------------------- Да. Именно так. |
||||
|
|||||
decembrist |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 1.4.2004 Репутация: нет Всего: нет |
Так что с таймером -то делать?
Создать поток вместо события OnTimer и как через поток его имитировать по Sleep()? Подскажите новичку ![]() |
|||
|
||||
bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
![]() Вот, RTOS: Windows CE .NET, Windows XP Embedded ![]() Остальные Windows конечно же не RTOS. |
|||
|
||||
Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 92 |
bel_nikita
Ну ладно, ладно -- согласен, что и виндовоз бывает эртэос ![]() И ещё, поставлю-ка я тебе "+". decembrist В чём именно тебе помочь? Тут уже кучу примеров привели. Что ещё нужно? Ты умеешь потоки создавать? Ты знаешь, как работает Sleep()? Ты знаешь, как устроена многозадачность в Windows? Объяснять-то много прийдётся. -------------------- Да. Именно так. |
|||
|
||||
Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 2 Всего: 62 |
Да я вообще не понимаю зачем тебе такая точность ![]() ![]() ![]() ![]() -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья ![]() |
|||
|
||||
bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Coocky я думаю прав.
А если на уровень ядра спустится? Можно конечно таймера перепрограммировать, но тогда хана всей системе. decembrist - переходи на RTOS ![]() Хотя RTOS тож такую точность не гарантирует. А для чего нужна такая точность? Если это устройство, то может в нем есть встроенный таймер? Тогда можно запрограммировать ентот таймер на сколь хошь. Ой, что-то меня понесло ![]() ![]() На сколько точен мультимедиа таймер З.Ы.: М-да, что-то, как-то сложно все это под виндой ![]() Это сообщение отредактировал(а) bel_nikita - 8.7.2004, 00:55 |
|||
|
||||
Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 92 |
Дык, Windows это ж система для домохозяек. Зачем там такие таймеры
![]() И на уровень ядра она тебя не очень-то пустит. Разве что драйвера попробовать писать ![]() decembrist Может можно и без таймера? Какова задача-то? ЗЫ: Вдруг окажется, что мы тут всё слишком усложняем? ![]() -------------------- Да. Именно так. |
|||
|
||||
Leopard25 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 17.4.2004 Репутация: нет Всего: нет |
http://www.proglib.ru/detail.asp?id=1169 prectimer.zip - MFC класс, реализующий очень точный таймер, использующий встроенный счетчик процессоров Pentium, который опрашивается инструкцией ассемблера RSDTC --------------------
Обдумай, верно ли и возможно ли то, что ты обещаешь, ибо обещание - есть долг. ( Конфуций ) |
|||
|
||||
Гость_Алексей |
|
||||
Unregistered |
В вашем исходнике есть библиотека sisp.h, я ее нимогу найти нигде. Если не сложно отправите на ящик [email protected], или ссылку. |
||||
|
|||||
KaraKum |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
У меня вопрос: как добывить таймер в форму? В "Toolbox" таймер (как и многие другие элементы) выглядет прозрачным и добавить его нельзя, а добавить его функцией "SetTimer()" не могу, потому что не знаю как Visual C++ назвала указатель на родительское окно. Подскажите!
![]() |
|||
|
||||
MTWizard |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 8.10.2007 Где: Київ Репутация: 3 Всего: 4 |
Функция QueryPerfomanceCounter - далеко не панацея. Как сказано в MSDN, на многоядерных процессорах она может отдать счётчик любого ядра, а они не обязательно синхронны :(. Так что, имхо, лучше всё-таки использовать мультимедийный. И его можно настроить.
Для того, чтобы увеличить разрешение для мультимедийного таймера, есть функция
Она описана так:"sets the minimum timer resolution for an application or device driver", т.е. как раз то, что надо. Но нужно помнить, что это действие является глобальным, так что после окончания работы с таймерами надо вызвать
с тем же параметром. Минимальная точность (точнее, максимальная) равна 1 мс. По моим замерам, после timeBeginPeriod(1) точность у таймера становится очень неплохой ![]() Вроде, это тема для раздела WinAPI |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |