Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-65734
ERDEN
2003-11-01 08:33
2003.11.20
BCD Error


1-65948
ghg
2003-11-11 11:54
2003.11.20
процедура reset


14-66078
ProjectMaker
2003-10-22 20:15
2003.11.20
Всегда ли находит тот, кто ищет?


11-65809
asp
2003-03-03 21:40
2003.11.20
Обработка сообщений.


14-66133
Пубертанец
2003-10-30 14:04
2003.11.20
Что такое ISO9000?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский