Текущий архив: 2004.10.24;
Скачать: CL | DM;
ВнизЗадержка без использования TTimer Найти похожие ветки
← →
VasRog (2004-10-05 23:06) [0]Подскажите, пожалуйста, как можно организовать простой программы на некоторое время без использования TTimer. Помнится в паскале была функция DELAY(), которая этим занималась, но я так понимаю в дДельфи ее убрали.
← →
BDenis © (2004-10-05 23:09) [1]
Sleep (1000)
- 1 секунда сна :)
← →
pipll © (2004-10-05 23:10) [2]> VasRog
А чем TTimer не по нраву?
← →
tormoz (2004-10-05 23:29) [3]
var t: longint;
begin
..
t:=GetTickCount;
while GetTickCount<t+1000 do; //1000 - время в миллисекундах
..
end;
← →
Ihor Osov'yak © (2004-10-06 01:02) [4]2 [1] BDenis © (05.10.04 23:09)
> Sleep (1000) - 1 секунда сна :)
Это остонов потока. Куда еще ни шло в рабочих потоках, и то не всегда, в основном потоке гуишного приложенеия - ну очень мерзко смотрится...
2 [3] tormoz (05.10.04 23:29)
> t:=GetTickCount;
> while GetTickCount<t+1000 do; //1000 - время в миллисекундах
и получим почти 100 процентную загрузку системы.. С одновременной
заморозкой того же гуи, если в основном потоке..
Если все же на первом месте простота - то можно посоветовать некоторую модификацию этого способа -var t: longint;
begin
..
t:=GetTickCount;
while GetTickCount<t+1000 do //1000 - время в миллисекундах
begin
if GetQueueStatus(QS_ALLEVENTS) <> 0
then
Application.ProcessMessages
else
sleep(10);
end
..
end;
недостаток этого способа = недостаткам использования Application.ProcessMessages, в первую очередь - опасность нарваться на повторный вызов процедуры до окончания ее работы в случае бардачного кодирования..
....
если делать по человечески, то либо использовать апишные таймера -
см. SetTimer, KillTimer.
Либо перейти к обьектам синхронизации (с изменениям архитектуры приложения).
Кстати, для всяких WaitFor... можна также указывать время таймаута..
Если WaitFor... нужно использовать в основном потоке - то можно вспомнить про факт наличия MsgWaitForMultipleObjects - снова же с целью избежания "заморозки" основного потока.. примерно так -
while True do
begin
result := MsgWaitForMultipleObjects(1, hHandle, false, dwMilliseconds,
QS_AllINPUT);
case result of
WAIT_TIMEOUT,
WAIT_ABANDONED,
Wait_Object_0: Break;
Wait_Object_0 + 1:
if Peekmessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
end;
в принцыпе - опасность повторного вхождения здесь также сохраняется (при бардачке, естественно)...
← →
Amoeba © (2004-10-06 11:38) [5]Delay() из RxLib
← →
VasRog (2004-10-06 23:33) [6]Спасибо большое всем. Хорошо прошел
var t: longint;
begin
..
t:=GetTickCount;
while GetTickCount<t+1000 do //1000 - время в миллисекундах
begin
if GetQueueStatus(QS_ALLEVENTS) <> 0
then
Application.ProcessMessages
else
sleep(10);
end
..
end;
вот этот вариант. Простой слип почему-то не захотел должным образом работать.
← →
Mihey_temporary © (2004-10-06 23:37) [7]var i, k: Integer;
n: Integer;
...
Randomize;
for i := 1 to 100000000 do
for k := 1 to 100000000 do
n := Random(300000);
← →
Gero © (2004-10-06 23:41) [8]
> Mihey_temporary © (06.10.04 23:37)
Во, самый лучший вариант )
← →
VasRog (2004-10-07 17:18) [9]Удалено модератором
Примечание: Вопросы по разным темам - в разных ветках.
← →
Erik1 © (2004-10-07 17:38) [10]Присотановить, значить ничего не вычислять? Это просто, надо выйти из всех циклов с помощю exit. Если надо заморозить GUI то поробуй смертельный номер, сделай Susped главному потоку!
Страницы: 1 вся ветка
Текущий архив: 2004.10.24;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.034 c