Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.48 MB
Время: 0.008 c
3-86314
YaD
2003-12-02 08:20
2003.12.26
DBGrid


4-86602
Dave
2003-10-31 11:21
2003.12.26
Как отследить блокировку PC и logout в WinXP?


7-86571
genek84
2003-10-22 09:14
2003.12.26
Проблема с TMemoryStream


1-86359
Talla2k
2003-12-12 12:50
2003.12.26
shellAPI(с блокнотом)


7-86579
DelphiNew
2003-10-20 14:55
2003.12.26
Работа с весами





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский