Întârzierea delfinilor bine programată

Delphi întârziat bine

Ajutor vă rog!
În programul meu pe Delphi întârzierea este efectuată de operand SLEEP ().
Sub Win98, în cazul în care computerul este oprit în timpul întârzierii (de exemplu, utilizatorul nu descarca programul din memorie) apare un mesaj care indică faptul că programul este atârnat și nu răspunde - probabil că așteaptă răspunsul utilizatorului etc.






Cum pot evita acest mesaj, adică astfel încât programul să fie descărcat din memorie fără mesaje enervante Windows

nu utilizați funcția Sleep ().
înlocuiți cu GetTickCount și buclă cu Application.ProcessMessages.
deși nu sunt sigur dacă sistemul va jura în acest caz.

Rău, dar nu este ceva mai detaliat? Vă rog!

utilizări
Formulare, SysUtils;
.
// aDelay - întârziere în milisecunde
procedură Întârziere (aDelay: integer);
const
cMilliSec = 1/24/60/60/1000;
var
StartTime: dublu;
începe
StartTime: = Acum ();
în timp ce ((BegTime + aDelay * cMilliSec) Cerere.Modificări ();
se încheie;

Explicați pe cineva - Ce este BegTime.

procedura de întârziere (const delay: cardinal);
var
StT: Cardinal;
începe
StT: = GetTickCount;
repeta
Application.ProcessMessages;






până (GetTickCount - StT)> = Întârziere;
se încheie;
// Delay - întârzierea în milisecunde

Ne pare rău, în loc de BegTime scrie StartTime - a fost confundat%)

Utilizați buclă în interiorul funcției cu o întârziere, în care robinet așteptați întrerupeți steagul, dacă este necesar:
Exemplul de mai jos nu pretinde exactitatea numărului de intervale, dar este potrivit ca exemplu.

Ca un exemplu simplu:
(Când butonul 1 este apăsat, așteptarea este pornită, când butonul 2 este apăsat, este întrerupt.

procedura MySleep (const aMSec: Integer; var aFlagBreak: Boolean);
var
Interval: Integer;
începe
Interval: = aMSec;
în timp ce Interval> 0 face
începe
dacă aFlagBreak apoi ieșiți;
somn (100);
Dec (Interval, 100);
Application.ProcessMessages;
se încheie;
se încheie;

procedura TForm1.Button1Click (expeditor: TObject);
începe
fl: = False;
MySleep (10000, fl);
Edit1.Text: = "Așteptarea sa terminat";
se încheie;

procedura TForm1.Button2Click (expeditor: TObject);
începe
fl: = Adevărat;
se încheie;

Ajutor.
Pur și simplu de dragul lui progba a făcut o întârziere mare, dar nu funcționează :-(
.
procedură Întârziere (aDelay: integer);
const
cMilliSec = 1/24/60/60/1000;
var
StartTime: dublu;
începe
StartTime: = Acum ();
în timp ce ((starttime + aDelay * cMilliSec) Cerere.Modificări ();
se încheie;
procedura TForm1.Button1Click (expeditor: TObject);
începe
întârziere (1000000000);
label1.Caption: = "Întârziere";
se încheie;
.

Dar adevărul este că nu este. În general, nu există. Titlurile se schimbă imediat, fără întârziere!

Deoarece în timp ce ((starttime + aDelay * cMilliSec) Mai mult acum

Înțeleg că totul funcționează! Mulțumesc lui Anatoly Podgorețki și Stratos.

Rămâne doar pentru a verifica sub Win98.

IMHO, dacă trebuie să vorbim într-o întârziere adecvată, trebuie să vorbim de la MsgWaitForMultipleObjects. Și procesorul nu se încarcă, iar procesarea mesajelor nu încetinește.







Trimiteți-le prietenilor: