static DWORD TStart=GetTickCount();
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Canvas->TextOut(0,0, ::GetTickCount() - TStart );
}
//---------------------------------------------------------------------------
Проблема с системным таймером
У меня наблюдается чрезвычайно странный глюк.
Вот простейший код (форма с таймером):
Код:
Через какие-то неравные промежутки времени инкрементирование числа останавливается и висит в таком положении какие-то доли секунды, потом опять продолжается. Причем, без скачка.
Я бы мог подумать, что это виснет моя программа, но раз используется системный таймер, то, получается, это он тормозит. Т.е. у меня весь компьютер виснет на какие-то доли секунды вместе с системным таймером (страшная вещь). Но если бы это было так, мои часы (те, что в трее) постепенно начинали бы отставать, но они идут исправно.
Подскажите, пожалуйста, в чем может быть проблема, у меня голова уже не варит.
И на сколько большие эти участки времени? Из представленного не видно как часто происходит обновление, но этого и не надо. Видать, "подтормаживает" при попадании GetTickCount в тот момент, когда происходит обновление времени.
нет, тормоза даже до 2 секунд продолжаются иногда
Цитата: John Paramol
Здравствуйте.
Я бы мог подумать, что это виснет моя программа...
Я бы мог подумать, что это виснет моя программа...
А что же еще виснит?
Цитата: John Paramol
но раз используется системный таймер, то, получается, это он тормозит.
GetTickCount выдает кол-во милисекунд. Это не таймер. А если используешь таймер, то, возможно, и не успевает обновиться Canvas.
Это не может виснуть моя программа т.к.:
1) сообщения таймера все равно скапливаются в очередь и рано или поздно будут обработаны (переполнение очереди сообщений не будем считать).
2) если некоторые из сообщений все же были пропущены и/или последующие сообщения обрабатываются не в то время (например, на секунду позже), это бы порождало скачок числа (равный по длине времени подвисания), т.к. вызывается GetTickCount, т.е. нет привязки к количеству вызовов обработчика таймера.
[QUOTE=Alfá;245232]GetTickCount выдает кол-во милисекунд. Это не таймер.[/QUOTE]
Я понимаю, это не суть важно
[QUOTE=Alfá;245232]А если используешь таймер, то, возможно, и не успевает обновиться Canvas.[/QUOTE]
опять же, после каждого такого торможения канвы, был бы скачок.
А так получается, что с течением времени копится все бОльшая и бОльшая задержка. Кто знает, может через сутки она составит пару часов...
Но часы не могут подвисать, а в магию я не верю...
Все, надо поспать немного. Глядишь, утром чего придумается. Вот из-за такого гавна у меня большая работа встала
В любом случае, пока проблема снова не появится, я беспокоиться не буду. Ну а если появится снова, еще напишу.
Рано обрадовался, опять началось...
Такое ощущение, что компьютер отдохнул ночью, потом поработал нормально и снова начал тормозить. Но часы в трее не отстают - вот парадокс.
Может, есть другие способы узнать время кроме GetTickCount/GetSystemTime/GetLocalTime?