![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Задержка без использования TTimer [D7, WinXP]
VasRog © (2004-10-05 23:06:00)Подскажите, пожалуйста, как можно организовать простой программы на некоторое время без использования TTimer. Помнится в паскале была функция DELAY(), которая этим занималась, но я так понимаю в дДельфи ее убрали.
Erik1 (2004-10-07 17:38:00) [1]Присотановить, значить ничего не вычислять? Это просто, надо выйти из всех циклов с помощю exit. Если надо заморозить GUI то поробуй смертельный номер, сделай Susped главному потоку!
VasRog (2004-10-07 17:18:00) [2]Удалено модератором
Примечание: Вопросы по разным темам - в разных ветках.
Gero (2004-10-06 23:41:00) [3]
> Mihey_temporary © (06.10.04 23:37)
Во, самый лучший вариант )
Mihey_temporary (2004-10-06 23:37:00) [4]var i, k: Integer;
n: Integer;
...
Randomize;
for i := 1 to 100000000 do
for k := 1 to 100000000 do
n := Random(300000);
VasRog (2004-10-06 23:33:00) [5]Спасибо большое всем. Хорошо прошел
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;
вот этот вариант. Простой слип почему-то не захотел должным образом работать.
Amoeba (2004-10-06 11:38:00) [6]Delay() из RxLib
Ihor Osov'yak (2004-10-06 01:02:00) [7]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;
в принцыпе - опасность повторного вхождения здесь также сохраняется (при бардачке, естественно)...
tormoz (2004-10-05 23:29:00) [8]
var t: longint;
begin
..
t:=GetTickCount;
while GetTickCount<t+1000 do; //1000 - время в миллисекундах
..
end;
pipll (2004-10-05 23:10:00) [9]> VasRog
А чем TTimer не по нраву?
BDenis (2004-10-05 23:09:00) [10]
Sleep (1000)- 1 секунда сна :)