Форум: "Основная";
Текущий архив: 2003.12.26;
Скачать: [xml.tar.bz2];
ВнизЗамена функции sleep(С) Найти похожие ветки
← →
S@shka (2003-12-15 13:46) [0]Возникла необходимость использования задержки в программе, причем
время [10...2000] мс. На этапе тестирования мне кажется что функции sleep весьма посредственно справляется со своими обязанностями, хотя в Help нет упоминания что она коим образом привязана к цифре 55 мс. Однако например разницу между sleep (10) и sleep (20) я в проге вижу а вот sleep (140) sleep (145) уже нет.
Приходит в голову вот такая весчь
procedure CoolTimer (Value : Cardinan);
var
CurTime : TDateTime;
begin
CurTime := Now;
repeat
;
until (Now - CurTime) > Value;
end;
В отношении UNTIL могу ошибаться но смысл должен быть понятен
← →
Silver Alex (2003-12-15 14:01) [1]procedure TimeOut(const aValue: Cardinal);
var
tmp: Cardinal;
begin
tmp:=GetTickCount;
while (GetTickCount-tmp)<aValue do
Application.ProcessMessages;
end;
← →
pasha_golub (2003-12-15 14:03) [2]procedure TimeOut(const aValue: Cardinal);
var
tmp: Cardinal;
begin
tmp:=GetTickCount;
while (GetTickCount-tmp) <=aValue do
Application.ProcessMessages;
end;
Хотя больщой разницы нету :-)
← →
Anatoly Podgoretsky (2003-12-15 14:05) [3]Разница существенная, проявляется когда компьютер проработал приерно 49 дней.
← →
S@shka (2003-12-15 14:07) [4]А по конкретнее что значит разница существенная ???
не понятно
← →
pasha_golub (2003-12-15 14:12) [5]2Anatoly Podgoretsky
Тоже аргумент
2S@shka
Разница в сравнении. В одном случае "<", а в другом "<="
← →
Silver Alex (2003-12-15 14:37) [6]я просто показал реализацию, а уже условия можно подставить какие надо.И конечно если "компьютер проработал примерно 49 дней" будут траблы.надо смотреть какая именно задача стоит
← →
Rem (2003-12-15 14:56) [7]Думается мне, что 20 мс больше 10 мс ровно в 2 раза, а вот 145 мс больше 140 мс в 1,035 раз.
Так что "увидеть в проге разницу"... возможно ли?
А Sleep() работает хорошо...
← →
Anatoly Podgoretsky (2003-12-15 15:04) [8]S@shka © (15.12.03 14:07) [4]
2^31 со знаком и 2^32 без знака. Дальше сам все поймешь, у первой функции в два раза больше возможностей для ошибки. Только это к делу отношения не имеет, просто мне почему то показвлось, что в первом случае использован Integer. Так что остаются только проблема на границе 49 дней.
← →
S@shka (2003-12-15 15:07) [9]Ну судя по всему просто abs использовать
← →
Sha (2003-12-15 15:22) [10]>Anatoly Podgoretsky © (15.12.03 14:05) [3]
>Разница существенная, проявляется когда компьютер проработал
>приерно 49 дней.
>Anatoly Podgoretsky © (15.12.03 15:04) [8]
>...Так что остаются только проблема на границе 49 дней.
Точнее будет так:
Ошибка возникнет при попытке измерить большие интервалы времени (примерно 49 дней и более).
← →
Anatoly Podgoretsky (2003-12-15 15:34) [11]Для объяснения на примере 4 битный целых без знака
Пуст интервал 7 и начало в 14
№ ## <7 <=7 <2 <=2
1 15-14=1
2 0-14=2 выход
3 1-14= 3 выход
4 2-14=4
5 3-14=5
6 4-14= 6 выход
7 5-14=7 выход
8 6-14=8
9 7-14=9
10 8-14=10
11 9-14=11
12 10-14=12
13 11-14=13
14 12-14=14
15 13-14=15
16 14-14=0
17 15-14=1
Видно, что правильно только выражение <=
Для интервала 7, в первом случае будет преждевременный выход.
Для интервала 2, в первом случае будет запоздалый выход
противоположная ошибка, вместо двух тактов, будет больше 3
← →
Anatoly Podgoretsky (2003-12-15 15:35) [12]Sha © (15.12.03 15:22) [10]
Нет ошибка возникает и при малых интервалах, смотри пример выше.
← →
REA (2003-12-15 15:38) [13]Никто не гарантирует такую точность в этой OS. Если винчестер занялся свопом, то она и пару секунд может дольше проспать. Для написания критичных ко времени участков нужны драйвера.
На быстрой машине конечно допускаю, что будет работать +/- 1мсек.
А какая задача? Для чего такая точность?
← →
Sha (2003-12-15 15:50) [14]Anatoly Podgoretsky © (15.12.03 15:35) [12]
Какой знак нарисовали, такой выход и получили - это понятно.
По-моему, таблица выглядит так. Здесь нет ни запоздалых, ни преждевременных выходов:
№ ## <7 <=7 <2 <=2
1 15-14=1
2 0-14=2 выход
3 1-14=3 выход
4 2-14=4
5 3-14=5
6 4-14=6
7 5-14=7 выход
8 6-14=8 выход
9 7-14=9
10 8-14=10
11 9-14=11
12 10-14=12
13 11-14=13
14 12-14=14
15 13-14=15
16 14-14=0
17 15-14=1
Я о другом. Без разницы, сколько времени проработал комп, хоть 49, хоть 149. Важно, какой интервал измеряем: большой или маленький.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.12.26;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c