Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];
ВнизГрамотная задержка времени в Delphi Найти похожие ветки
← →
Zorlag (2003-11-09 22:58) [0]Помогите пожалуйста!
В моей программе на Delphi осуществляется задержка времени посредством операнда SLEEP().
Под Win98, если компьютер выключается во время этой задержки (допустим, пользователь не выгрузил программу из памяти) выскакивает сообщение о том, что прога зависла и не отвечает на запросы -- возможно она ожидает ответа пользователя и.т.д...
Как мне избежать появления этого сообщения, т.е. чтобы программа выгружалась из памяти без надоедливых сообщений Windows&
← →
wicked (2003-11-09 23:12) [1]не использовать Sleep()...
заменить на GetTickCount и цикл с Application.ProcessMessages...
хотя я не уверен, будет ли в этом случае ругаться система...
← →
Zorlag (2003-11-09 23:19) [2]Wicked, а нельзя ли чуть поподробнее? Пожалуйста!
← →
Stratos (2003-11-09 23:34) [3]
uses
Forms, SysUtils;
...
// aDelay - задержка в миллисекундах
procedure Delay(aDelay: integer);
const
cMilliSec = 1/24/60/60/1000;
var
StartTime: double;
begin
StartTime:= Now();
while ((BegTime + aDelay*cMilliSec) < Now()) do
Application.ProcessMessages();
end;
← →
default (2003-11-09 23:38) [4]Zorlag © (09.11.03 22:58)
"посредством операнда SLEEP"
это не так, говори тогда уж "оператор"
← →
Zorlag (2003-11-09 23:39) [5]Ok. Понял.
← →
Zorlag (2003-11-09 23:42) [6]Поясните кто-нибудь -- Что такое BegTime??
← →
default (2003-11-09 23:47) [7]procedure Delay(const Delay: Cardinal);
var
StT: Cardinal;
begin
StT:= GetTickCount;
repeat
Application.ProcessMessages;
until (GetTickCount - StT) >= Delay;
end;
// Delay - задержка в миллисекундах
← →
Плохиш_ (2003-11-09 23:48) [8]=StartTime
← →
Stratos (2003-11-09 23:49) [9]Sorry, вместо BegTime напиши StartTime - ошибся %)
← →
panov (2003-11-09 23:54) [10]Используй цикл внутри функции с задержкой, в которой взводи флажок прерывания ожидания, если нужно:
Нижепреведенный пример не претендует на точность отсчитывания интервалов, но годится в качестве примера.
Как простейший пример:
(При клике на кнопку 1 запускается ожидание, при клике на кнопку 2 -прерывается.
var
Form1: TForm1;
fl: Boolean;
...
...
procedure MySleep(const aMSec: Integer;var aFlagBreak: Boolean);
var
Interval: Integer;
begin
Interval := aMSec;
while Interval>0 do
begin
if aFlagBreak then Exit;
sleep(100);
Dec(Interval,100);
Application.ProcessMessages;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
fl := False;
MySleep(10000,fl);
Edit1.Text := "Ожидание закончено";
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
fl := True;
end;
← →
Zorlag (2003-11-09 23:56) [11]Help!!!
Чисто ради прогбы составил прогу -- выставил большую задержку, а она не работает :-(
.............
procedure Delay(aDelay: integer);
const
cMilliSec = 1/24/60/60/1000;
var
StartTime: double;
begin
StartTime:= Now();
while ((starttime + aDelay*cMilliSec) < Now()) do
Application.ProcessMessages();
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
delay (1000000000);
label1.Caption:="Задержка";
end;
.......
← →
default (2003-11-10 00:11) [12]Zorlag © (09.11.03 23:56) [11]
ты поставил задержку примерно на 278 часов
← →
Zorlag (2003-11-10 00:14) [13]Но факт в том, что её нет!! Нет вообще т.е. Caption изменяется сразу, без задержки!
← →
Anatoly Podgoretsky (2003-11-10 00:21) [14]Потому что while ((starttime + aDelay*cMilliSec) < Now()) do
Больше Now
← →
default (2003-11-10 00:24) [15]Zorlag © (10.11.03 00:14) [13]
чем проще вещь, тем она надёжнее - [7]
← →
Zorlag (2003-11-10 00:26) [16]Понялю Всё работает! Спасибо Anatoly Podgoretsky и Stratos.
Осталось только проверить под Win98.
← →
Юрий Зотов (2003-11-10 01:34) [17]IMHO, если уж говорить о грамотной задержке, то надо говорить от MsgWaitForMultipleObjects. И процессор не грузит, и обработку сообщений не замедляет.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c