Hm, nisam siguran da dobro razumem tvoje pitanje. Ali odgovoricu kako sam razumeo.
1) Ako se koristi timer, nema potrebe za ProcessMessages. Zasto? Zato sto je OnTimer event zapravo obrada sistemske poruke WM_TIMER. Cim se izadje iz event-a, mainthread je slobodan za dalji rad/poruke (Win je event-oriented OS, zar ne?)
2) Ako se ostaje pri originalnom kodu autora teme, onda treba modifikovati while petlju, recimo ovako:
Code:
fScrollStopped := false; // pocinjemo skrolovanje kursora
while not(PDM.cdsRedVoznje.Eof) and not(fScrollStopped) do
begin
if GetAsyncKeyState(VK_ESCAPE) = 1 then begin
exit;
end ;
PDM.cdsRedVoznje.Next ;
PDM.cdsRelacije.Filter := 'FIRMA_ID = ' + PDM.cdsRedVoznjeFIRMA_ID.AsString + 'AND PRAVAC_ID = ' +
PDM.cdsRedVoznjePRAVAC_ID.AsString + 'AND CIJENA>0';
DBGrid2.Refresh ;
// SysUtils.Sleep(PDM.cdsTimeParamTimeScroll1.AsInteger*1000) ;
SmartSleep(PDM.cdsTimeParamTimeScroll1.AsInteger*1000); // ovde imamo ProcessMessages
end ;
Varijabla fScrollStoped je tipa boolean, pripada formi na kojoj se sve nalazi. Recimo da je u nekom handler-u neke kontrole (OnClick, onChange itd.) postavljamo na true; autor ce znati vec KAD zeli da prekine skrolovanje kursora. Application.ProcessMessages (unutar SmartSleep()) ce omoguciti da se taj handler i IZVRSI; na taj nacin izlazimo iz petlje, i sve funkcionise taman kako treba.
Uostalom, evo i kako izgleda originalna funkcija SmartSleep(), koju sam pisao/koristio za rad unutar thread-a:
Code:
procedure TMyThread.SmartSleep(aMils: cardinal); // milisekunde
var
aFutureTick: cardinal;
begin
aFutureTick := GetTickCount + aMils;
while (GetTickCount < aFutureTick) and not(Terminated) do
Sleep(20); // bilo sta vece od 0, ali dovoljno malo da kod 'tece'
end;
Terminated se setuje negde drugde (drugi thread, handler, ko ce znati). Zgodan trik, zar ne?
Pozz
P.S. Izvinjavam se sto za operator
not koristim zagrade; navika iz ranijih vremena.
P.P.S. Sad videh i onaj nesrecni exit, uh, uh... to je meni isto kao i goto; totalno neprihvatljivo u Pascal-u. Ali to je samo moje misljenje.