| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > проблемы с системным таймером |
| Автор: crYon 14.5.2008, 22:54 | ||
| Здравствуйте. У меня наблюдается чрезвычайно странный глюк. Вот простейший код в Билдере (форма с таймером):
Через какие-то неравные промежутки времени инкрементирование числа останавливается и висит в таком положении какие-то доли секунды, потом опять продолжается. Причем, без скачка. Я бы мог подумать, что это виснет моя программа, но раз используется системный таймер, то, получается, это он тормозит. Т.е. у меня весь компьютер виснет на какие-то доли секунды вместе с системным таймером (страшная вещь). Но если бы это было так, мои часы (те, что в трее) постепенно начинали бы отставать, но они идут исправно. Подскажите, пожалуйста, в чем может быть проблема, у меня голова уже не варит. |
| Автор: xvr 15.5.2008, 12:06 |
| На какой интервал настроен Timer1? При малых интервалах так вполне может быть |
| Автор: crYon 15.5.2008, 19:38 |
| Не важно, на какой. Например на 1000 или 100 мс. А почему на малых вдруг такое может быть? |
| Автор: xvr 15.5.2008, 19:46 | ||
Event'ы от таймера приходят в виде сообщений через общую очередь сообщений. Если интервал маленький или в цикле обработки сообщений есть какие то процедуры занимающие много времени, то event'ы от таймера будут накапливаться в очереди и потом отрабатываться пачками. |
| Автор: Artemon 16.5.2008, 06:16 |
| Если хотите чтобы было все ровно, то запустите поток, а в нем пытайтесь отсчитывать время, если на экран не будете выводить, то тормозить не будет, при выводе на экран опять могут начаться такие косяки, т.к. придется использовать Synchronize. |
| Автор: mrbrooks 16.5.2008, 07:49 | ||
| Во первых Timer не рекомендуется использовать на интервале меньше 50. Во вторых лучше явно приводить к типу указанному в сигнатуре функции. Не стоит уповать на приведение типов Бормана по умолчанию.
В третьих что такого ужасного выводить данные в компонент - типа метки или statictext и забить на канву? |
| Автор: mrbrooks 16.5.2008, 09:23 |
| Борман шутливое название Борланда. А теперь объясни мне разницу в билдере между String и AnsiString? |
| Автор: xvr 16.5.2008, 12:00 | ||||||||
Не совсем:
|
| Автор: Artemon 16.5.2008, 14:55 | ||
Если причина в GetTickCount то не поможет, События таймеры ваполняются в основном потоке, поэтому таймеру приходится подвинуться, если вы выполняете какие-то действия с интерфейсом, думаю всетаки в этом причина, да и к томуже не такая сложная задача сделать это в новом потоке, максимум что можно потерять - это 10 минут времени. |
| Автор: crYon 16.5.2008, 15:13 | ||||||||
Никакой. Просто я так понял, что ты хочешь следовать сигнатуре функции.
А VCL использует DispatchMessage всегда. Правда эту фразу тоже можно понять двояко, что имеется в виду под "другими сообщениями" - любые сообщения, уже содержащиеся в очереди, или сообщения, отличающиеся от WM_TIMER. Добавлено через 2 минуты и 33 секунды Провел несколько тестов. Результаты очень интересные. Запустил прогу и сверял по механическому секундомеру. После 5 минут задержка составила ~ 25 секунд. После 10 минут задержка составила ~ 48 секунд. Запустил два экземпляра проги (в разное время). Обе проги тормозили абсолютно синхронно. Т.е. счетчик останавливался и снова запускался в обоих прогах одновременно, хотя запущены они были в разное время. Отсюда я опять делаю вывод, что тормозят именно системные часы. Но, повторюсь, часы в трее идут исправно. Стало быть, они используют другие механизмы, отличные от вызовов GetTickCount/GetSystemTime/GetLocalTime. Все никак не могу проверить на другом компьютере. Кто-нибудь проверял данный код? Ни у кого больше задержки не было? Я либо скоро стану идиотом, либо поверю в колдовство, либо раскрою страшный баг Windows. Или это будет баг Матрицы. А может это будет парадокс, который повлечет за собой цепную реакцию и разрушение вселенной... |
| Автор: crYon 16.5.2008, 20:13 | ||
Попробовал без использования VCL, на WinAPI.
Та же самая история... |