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

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

  1. provocateur

    provocateur Member

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

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

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

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    SetTimer+(GetSystemTime or GetLocalTime)
     
  3. provocateur

    provocateur Member

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

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    volatile someType time;
    CreateThread

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

    }

    }

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

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    provocateur
    чаще делай обновление часиков
     
  6. provocateur

    provocateur Member

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

    iZzz32 Sergey Sfeli

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

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1. while (GetSystemTime().second == lastTime.second)
    2. {
    3.     Sleep(0);
    4. }
     
  9. provocateur

    provocateur Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    118
    n0name
    Спасибо! :))) Красиво.

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

    Y_Mur Active Member

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

    provocateur Member

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

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    SetTimer время не выдаёт.
     
  13. AlexCab

    AlexCab New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2008
    Сообщения:
    142
    CreateWaitableTimer + SetWaitableTimer(каждый раз на секунду вперёд).
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    provocateur
    Вам по таймеру время нужно считывать и апдейтить его отображение, разницу поймите.
     
  15. provocateur

    provocateur Member

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

    Booster New Member

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

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    provocateur
    Интервал нотификации можно установить много меньше секунды. Это логическое следствие из вашего вопроса в первом сообщении.
     
  18. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    provocateur
    может начинать нудно не от GetSystemTime()
    а с отсылки ntp запроса на 0.ru.pool.ntp.org.

    как красиво!

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