Показать полную графическую версию : Time Delay in C++Builder 4 or 5
Нужна задержка с точностью 0.1 сек по крайней мере
vasketsov
27-12-2002, 12:09
Задержку с такой точностью реально организовать обычным Sleep().
Sleep не позволяет на самом деле делать задержки менее 37 милисекунд. Даже если ему поставить 1 мсек - то реально будет 37 или более!!! Как быть???
vasketsov
27-12-2002, 13:18
Guest
0,1 с - это 100 мс, так что аккуратнее (кроме того, 37 или нет - зависит от очень многих факторов, включая прежде всего версию операционной системы).
1) Какую задержку надо и с какой точностью она должна отмеряться?
2) На каких системах это должно работать.
1. Задержка нужна с точностью 10 мсек.
2. Хорошо бы чтоб на всех, но для начала Win2000, NT4. Но желательно знать как бороться с этой проблемой во всех операционных системах.
Спасибо
vasketsov
30-12-2002, 13:23
Guest
Для таких задержек можно использовать WaitableTimer или даже обычный, если заюзать код ниже.
Еще раз, величина задержки и точность ее отмеривания - разные вещи. Ясно, что величина больше, чем точность, но можно задаться целью отмерять задержки в 1 секунду с точностью 1 мс, то есть, выполнение будет происходить через 1 секунду +- 1 мс. А у вас 10 мс - это видимо величина задержки (интервал), с какой точностью его надо отмерять?
Еще советую (для NT) выполнить такой код:
#define NTSTATUS int
#define STATUS_SUCCESS 0
#define NTAPI __stdcall
NTSTATUS
NTAPI
ZwQueryTimerResolution
(OUT PULONG CoarsestResolution,
OUT PULONG FinestResolution,
OUT PULONG ActualResolution);
NTSTATUS
NTAPI
ZwSetTimerResolution
(IN ULONG RequestedResolution,
IN BOOLEAN Set,
OUT PULONG ActualResolution);
ULONG ActualResolution;
ULONG MinimumResolution;
ULONG MaximumResolution;
if (ZwQueryTimerResolution(&MinimumResolution,&MaximumResolution,&ActualResolution) == STATUS_SUCCESS)
ZwSetTimerResolution(MinimumResolution, TRUE, &ActualResolution);
Приведены описания фунций, они из ntdll.dll и есть во всех NT-системах.
Устанавливает разрешение системного таймера для текущего процесса на минимально возможное (в большинстве случаев - 1 мс).
Странно, а как же квант времени, выделяемый на одну задачу? Еще меньше кванта? Я то боролся по старинке с этим. Запускал фоновый процесс на 2 сек, который считал количество пустых циклов и потом считал, что это быстродействие компьютера, а там где задержка - циклов меньше, естественно. :) Тупо но работало и меньше 1 мс
vasketsov
14-01-2003, 10:51
Crew
Только такие решения систему грузят.
vasketsov
int __stdcall ZwSetTimerResolution(...
int __stdcall ZwSetTimerResolution(....
Откуда-то экспортируются, а откуда? или я неправильно понял?
А что за тип данных PULONG ? Я такого не встречал еще.
Исправлено: Crew, 5:55 15-01-2003
vasketsov
15-01-2003, 11:45
Crew
1) из ntdll.dll, написано внизу сообщения.
2) PULONG - указатель на ULONG.
vasketsov
2) PULONG - указатель на ULONG.
Сказался длительный перерыв в программировании :shuffle:
А не для NT какой код надо заюзать?
нужна выдержка в 2 мс, если 2.5 мс будет, то код уже нерабочий, а с циклом пустым работало одинаково хорошо с любым приоритетом, хоть и Crew
Только такие решения систему грузят.
vasketsov
16-01-2003, 12:54
Crew
можешь мультимедийные таймеры попробовать использовать, если есть они на 9x.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.