Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2013, 10:01   #1
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию Странное поведение GetTickCount и Sleep

Заметил странную штуку. Вот этот код
Код:
var
  b, e: Cardinal;
begin
  b := GetTickCount;
  Sleep(3);
  e := GetTickCount;
  ShowMessage (IntToStr (e-b));
end;
В результате выдает 0. Но ведь обе процедуры и GetTickCount и Sleep работают с миллисекундами. Разница (e-b) как минимум должна составлять 3.
Sibedir вне форума Ответить с цитированием
Старый 17.01.2013, 10:10   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Sibedir, сама система запаздывает на пару сотен MS от реального времени.
Человек_Борща вне форума Ответить с цитированием
Старый 17.01.2013, 10:17   #3
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Sibedir, сама система запаздывает на пару сотен MS от реального времени.
Ну и что. Если я проспал на работу, это не значит, что время затраченное на поездку в транспорте уменьшится. Поясни, пожалуйста.
И кстати, вот так
Код:
var
  b, e: Cardinal;
begin
  b := GetTickCount;
  Sleep(30);
  e := GetTickCount;
  ShowMessage (IntToStr (e-b));
end;
всё работает более-менее корректно (хотя пару раз выдало 16). А при увеличении до, скажем, 1000, вообще всё четко.

Последний раз редактировалось Sibedir; 17.01.2013 в 10:22.
Sibedir вне форума Ответить с цитированием
Старый 17.01.2013, 10:35   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Поясни, пожалуйста.
Пару сотен МС теряется в процессе передачи данных из ядра в систему к пользователю, по этому замеры менее 300-500 мс не гарантированы результатом.
Человек_Борща вне форума Ответить с цитированием
Старый 17.01.2013, 10:47   #5
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Всеравно не понятно. Из того, что вы сказали, следовало бы предположить не уменьшение, а увеличение результата. Может просто GetTickCount использует источник (память по какому-то адресу), который обновляется не постоянно, а с периодом где-то 15-16 мс (см. код) (видимо через определенное колличество тактов).
Код:
var
  b, e: Cardinal;
begin
  b := GetTickCount;
  repeat
    e := GetTickCount;
  until b<>e;
  ShowMessage (IntToStr (e-b));
end;
Но всё вышесказанное не объясняет абсолютную точность при достаточно большом sleep.

Последний раз редактировалось Sibedir; 17.01.2013 в 10:56.
Sibedir вне форума Ответить с цитированием
Старый 17.01.2013, 10:57   #6
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

запусти в фоне WinRar тестирование и проверь свои результаты еще раз
результат будет плавать в зависимости от загрузки цп
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 17.01.2013 в 11:00.
Slym вне форума Ответить с цитированием
Старый 17.01.2013, 10:57   #7
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Косяк именно в Sleep(3). Слишком маленький интервал задержки может быть тупо проигнорирован, т.к. системные часы тикают слишком медленно
Подробности на msdn (раздел Remarks)
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 17.01.2013, 11:11   #8
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Сообщение от Luuzuk Посмотреть сообщение
Косяк именно в Sleep(3). Слишком маленький интервал задержки может быть тупо проигнорирован, т.к. системные часы тикают слишком медленно
Подробности на msdn (раздел Remarks)
Теперь понял. Спасибо.
Sibedir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
GetTickCount и Sleep goluzov Общие вопросы C/C++ 1 18.10.2012 09:24
Странное поведение realloc eraserhp Общие вопросы C/C++ 7 17.05.2010 09:52
Странное поведение gets alex_alpha Общие вопросы C/C++ 3 27.03.2010 18:21
Странное поведение null Vitalyk JavaScript, Ajax 6 13.02.2010 15:22
Странное поведение процедуры Sergey1974 Общие вопросы Delphi 2 11.12.2009 21:41