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

Discussion in 'WASM.BEGINNERS' started by provocateur, Nov 18, 2010.

  1. provocateur

    provocateur Member

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

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

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

    max7C4 New Member

    Blog Posts:
    0
    SetTimer+(GetSystemTime or GetLocalTime)
     
  3. provocateur

    provocateur Member

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

    punxer Андрей

    Blog Posts:
    0
    volatile someType time;
    CreateThread

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

    }

    }

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

    wsd New Member

    Blog Posts:
    0
    provocateur
    чаще делай обновление часиков
     
  6. provocateur

    provocateur Member

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

    iZzz32 Sergey Sfeli

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

    n0name New Member

    Blog Posts:
    0
    Code (Text):
    1. while (GetSystemTime().second == lastTime.second)
    2. {
    3.     Sleep(0);
    4. }
     
  9. provocateur

    provocateur Member

    Blog Posts:
    0
    n0name
    Спасибо! :))) Красиво.

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

    Y_Mur Active Member

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

    provocateur Member

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

    Booster New Member

    Blog Posts:
    0
    SetTimer время не выдаёт.
     
  13. AlexCab

    AlexCab New Member

    Blog Posts:
    0
    CreateWaitableTimer + SetWaitableTimer(каждый раз на секунду вперёд).
     
  14. Clerk

    Clerk Забанен

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

    provocateur Member

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

    Booster New Member

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

    Clerk Забанен

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

    _sheva740 New Member

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

    как красиво!

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