Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.20;
Скачать: CL | DM;

Вниз

Грамотная задержка времени в 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.024 c
4-66169
kkostik
2003-09-24 12:31
2003.11.20
Народ Help!


14-66129
MaG
2003-10-28 15:45
2003.11.20
Паскаль


4-66174
SH
2003-09-25 19:18
2003.11.20
Устойчивый PopUpMenu


6-66044
Dankin
2003-09-20 02:38
2003.11.20
Вот такой вопрос. Может кто знает как можно узнать номер телефона


3-65694
Mikle
2003-10-30 11:52
2003.11.20
Как перетащить таблицу SQL из одной базы в другую?