Войти

Показать полную графическую версию : Time Delay in C++Builder 4 or 5


Guest
27-12-2002, 12:01
Нужна задержка с точностью 0.1 сек по крайней мере

vasketsov
27-12-2002, 12:09
Задержку с такой точностью реально организовать обычным Sleep().

Guest
27-12-2002, 12:27
Sleep не позволяет на самом деле делать задержки менее 37 милисекунд. Даже если ему поставить 1 мсек - то реально будет 37 или более!!! Как быть???

vasketsov
27-12-2002, 13:18
Guest
0,1 с - это 100 мс, так что аккуратнее (кроме того, 37 или нет - зависит от очень многих факторов, включая прежде всего версию операционной системы).

1) Какую задержку надо и с какой точностью она должна отмеряться?
2) На каких системах это должно работать.

Guest
27-12-2002, 22:15
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 мс).

Crew
14-01-2003, 07:01
Странно, а как же квант времени, выделяемый на одну задачу? Еще меньше кванта? Я то боролся по старинке с этим. Запускал фоновый процесс на 2 сек, который считал количество пустых циклов и потом считал, что это быстродействие компьютера, а там где задержка - циклов меньше, естественно. :)  Тупо но работало и меньше 1 мс

vasketsov
14-01-2003, 10:51
Crew
Только такие решения систему грузят.

Crew
15-01-2003, 05:53
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.

Crew
16-01-2003, 02:42
vasketsov
2) PULONG - указатель на ULONG.
Сказался длительный перерыв в программировании :shuffle:
А не для NT какой код надо заюзать?
нужна выдержка в 2 мс, если 2.5 мс будет, то код уже нерабочий, а с циклом пустым работало одинаково хорошо с любым приоритетом, хоть и Crew
Только такие решения систему грузят.

vasketsov
16-01-2003, 12:54
Crew
можешь мультимедийные таймеры попробовать использовать, если есть они на 9x.




© OSzone.net 2001-2012