Есть довольно много примеров программ, которые рисуют какие-нибудь часы. В основном используется решение "в лоб": создается таймер, который раз в секунду вызывает функцию отрисовки окна. Как следствие такого безобразного подхода секунды в разных часах, даже в дважды запущенных одинаковых программах, отличаются друг от друга и от "системного времени" Windows. 1. Как принято решать такую проблему? 2. SetTimer действительно выдает всегда точное время, и не убегут/не отстанут часы, если считать время внутри этой функции, а не брать системное? PS В приложении известный пример, который работает как описано.
max7C4, но ведь получается ситуация описанная мной - время не соответствует действительности. Максимальная погрешность - 1 секунда.
volatile someType time; CreateThread ThreadFunc() { while (b_runThread) { time=GetSystemTime or GetLocalTime } } попробуй таке
punxer в смысле молотить, пока не отловишь момент изменения времени, и после этого обычный таймер запускать? Или использовать поток постоянно все время работы программы?
provocateur, adjust-ить таймер, подсчитывая в обработчике время до начала следующей секунды (на основе системного времени, конечно же).
provocateur Разумеется SetTimer не часы реального времени и работают с поправкой на многозадачность, но если ты всегда "подсинхронизируешься" через GetSystemTime то накапливаться эта ошибка не будет.
Y_Mur Спасибо. Так я примерно и думал. Конечно, не было желания считать время через SetTimer, просто хотел узнать будет ли накапливаться ошибка "с запаздыванием" отображения времени. Но оказалось, что эталона под рукой все равно нет. Проверил, использовав совет n0name, запустив четыре копии часов. Друг с другом они шли почти один в один (только отрисовка могла задерживать отображение), но были совершенно рассинхронизированы с виндовым "Свойства: Дата и время". Виндовые часы чуть отставали, а значит сделаны тоже по принципу "просто запустим SetTimer".
Clerk Мне по таймеру нужно считывать время и перерисовывать изображение. Я про это написал в первом сообщении.
provocateur Интервал нотификации можно установить много меньше секунды. Это логическое следствие из вашего вопроса в первом сообщении.
provocateur может начинать нудно не от GetSystemTime() а с отсылки ntp запроса на 0.ru.pool.ntp.org. как красиво! Непростая задача - это определение времени, интересно а как может узнать программа в какой стране она сейчас запущенна? Чтобы обратиться к правильному NTP - серверу?