Как показать точное время?

Тема в разделе "WASM.BEGINNERS", создана пользователем provocateur, 18 ноя 2010.

  1. provocateur

    provocateur Member

    Публикаций:
    0
    Есть довольно много примеров программ, которые рисуют какие-нибудь часы.
    В основном используется решение "в лоб": создается таймер, который раз в секунду вызывает функцию отрисовки окна.
    Как следствие такого безобразного подхода секунды в разных часах, даже в дважды запущенных одинаковых программах, отличаются друг от друга и от "системного времени" Windows.

    1. Как принято решать такую проблему?
    2. SetTimer действительно выдает всегда точное время, и не убегут/не отстанут часы, если считать время внутри этой функции, а не брать системное?

    PS
    В приложении известный пример, который работает как описано.
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    SetTimer+(GetSystemTime or GetLocalTime)
     
  3. provocateur

    provocateur Member

    Публикаций:
    0
    max7C4, но ведь получается ситуация описанная мной - время не соответствует действительности. Максимальная погрешность - 1 секунда.
     
  4. punxer

    punxer Андрей

    Публикаций:
    0
    volatile someType time;
    CreateThread

    ThreadFunc()
    {
    while (b_runThread)
    {
    time=GetSystemTime or GetLocalTime

    }

    }

    попробуй таке
     
  5. wsd

    wsd New Member

    Публикаций:
    0
    provocateur
    чаще делай обновление часиков
     
  6. provocateur

    provocateur Member

    Публикаций:
    0
    punxer
    в смысле молотить, пока не отловишь момент изменения времени, и после этого обычный таймер запускать?
    Или использовать поток постоянно все время работы программы?
     
  7. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    provocateur, adjust-ить таймер, подсчитывая в обработчике время до начала следующей секунды (на основе системного времени, конечно же).
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Код (Text):
    1. while (GetSystemTime().second == lastTime.second)
    2. {
    3.     Sleep(0);
    4. }
     
  9. provocateur

    provocateur Member

    Публикаций:
    0
    n0name
    Спасибо! :))) Красиво.

    А по поводу второго вопроса? На счет точности SetTimer.
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    provocateur
    Разумеется SetTimer не часы реального времени и работают с поправкой на многозадачность, но если ты всегда "подсинхронизируешься" через GetSystemTime то накапливаться эта ошибка не будет.
     
  11. provocateur

    provocateur Member

    Публикаций:
    0
    Y_Mur
    Спасибо. Так я примерно и думал.
    Конечно, не было желания считать время через SetTimer, просто хотел узнать будет ли накапливаться ошибка "с запаздыванием" отображения времени.
    Но оказалось, что эталона под рукой все равно нет. Проверил, использовав совет n0name, запустив четыре копии часов. Друг с другом они шли почти один в один (только отрисовка могла задерживать отображение), но были совершенно рассинхронизированы с виндовым "Свойства: Дата и время". Виндовые часы чуть отставали, а значит сделаны тоже по принципу "просто запустим SetTimer".
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    SetTimer время не выдаёт.
     
  13. AlexCab

    AlexCab New Member

    Публикаций:
    0
    CreateWaitableTimer + SetWaitableTimer(каждый раз на секунду вперёд).
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    provocateur
    Вам по таймеру время нужно считывать и апдейтить его отображение, разницу поймите.
     
  15. provocateur

    provocateur Member

    Публикаций:
    0
    Clerk
    Мне по таймеру нужно считывать время и перерисовывать изображение.
    Я про это написал в первом сообщении.
     
  16. Booster

    Booster New Member

    Публикаций:
    0
    Ну обновляйте 10 раз в секунду. В чём проблема-то?
     
  17. Clerk

    Clerk Забанен

    Публикаций:
    0
    provocateur
    Интервал нотификации можно установить много меньше секунды. Это логическое следствие из вашего вопроса в первом сообщении.
     
  18. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    provocateur
    может начинать нудно не от GetSystemTime()
    а с отсылки ntp запроса на 0.ru.pool.ntp.org.

    как красиво!

    Непростая задача - это определение времени,
    интересно а как может узнать программа в какой стране она сейчас запущенна?
    Чтобы обратиться к правильному NTP - серверу?