Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Time Delay in C++Builder 4 or 5 (http://forum.oszone.net/showthread.php?t=30719)

Guest 27-12-2002 12:01 209834

Нужна задержка с точностью 0.1 сек по крайней мере

vasketsov 27-12-2002 12:09 209835

Задержку с такой точностью реально организовать обычным Sleep().

Guest 27-12-2002 12:27 209836

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

vasketsov 27-12-2002 13:18 209837

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

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

Guest 27-12-2002 22:15 209838

1. Задержка нужна с точностью 10 мсек.
2. Хорошо бы чтоб на всех, но для начала Win2000, NT4. Но желательно знать как бороться с этой проблемой во всех операционных системах.
Спасибо

vasketsov 30-12-2002 13:23 209839

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 209840

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

vasketsov 14-01-2003 10:51 209841

Crew
Только такие решения систему грузят.

Crew 15-01-2003 05:53 209842

vasketsov
Цитата:

int __stdcall ZwSetTimerResolution(...
int __stdcall ZwSetTimerResolution(....
Откуда-то экспортируются, а откуда? или я неправильно понял?
А что за тип данных PULONG ? Я такого не встречал еще.


[s]Исправлено: Crew, 5:55 15-01-2003[/s]

vasketsov 15-01-2003 11:45 209843

Crew
1) из ntdll.dll, написано внизу сообщения.
2) PULONG - указатель на ULONG.

Crew 16-01-2003 02:42 209844

vasketsov
Цитата:

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

Crew
Только такие решения систему грузят.

vasketsov 16-01-2003 12:54 209845

Crew
можешь мультимедийные таймеры попробовать использовать, если есть они на 9x.


Время: 00:49.

Время: 00:49.
© OSzone.net 2001-