[ franjo_tahi2 @ 09.07.2014. 10:14 ] @
Još jedno pitanje:

Program iz Timera starta nekoliko procedura. Kad završi sve što se poziva iz Timera, program se završava.

Problem:
Kako prekinuti izvršavanje programa nakon određenog vremena ako procedure iz Timera nisu gotove, tj. još uvijek se vrte?
Pokušao sam pokrenuti drugi Timer i u njemu kontrolirati proteklo vrijeme, pa terminirati program, ali ne radi. Probao sam:

fmMain.Close;
Application.Terminate;

Niti jedna naredba ne zaustavlja program.

Timer2 se ne starta ako ne pozovem Application.ProcessMessage;

Želio bih da se bez ikakovog uvijeta, nakon x sati program zaustavi. Moguće je povziv SQL-a ili beskonačna petlja (: tako da Application.ProcessMessage se ne pokrene, pa i program ostane visjeti.
[ captPicard @ 09.07.2014. 13:40 ] @
Pozivaš ovo

Code (delphi):
fmMain.Close;
Application.Terminate;


iz modalne forme ili is frmMain?

Jesi probao postaviti neku boolean varijablu unutar loopa koji može ići u infinity i onda isto tako unutar loopa odbrojavati i postaviti varijablu na true/false i napraviti Break/Abort te nakon toga pozvati Application.Terminate?
(Nadam se da si shvatio šta želim reći :D )
[ reiser @ 09.07.2014. 13:47 ] @
Negde si pogresio u dizajnu programa i verovatno imas thread iz kog se ne izlazi, ili slicno. Suvise malo informacija si dao da bi ti mogli dati neko konkretnije resenje.
[ franjo_tahi2 @ 09.07.2014. 14:56 ] @
Da, greška je u programu, ali želim bez obzira na grešku, završiti program nakon xx minuta.

Radi se o exportu podataka na web, kojih ima dosta i nezgodno su vezani. Dok ne otkrijem sve moguće probleme... Kad sve bude radilo kako treba, izlaz nakon xx minuta mi neće niti trebati. Ovo je samo osigurač da program ne ostane visiti beskonačno. Vrti se na sreveru i nije mi najzgodnije ga stalno kontrolirati.

Try ... except ne koristi jer se može dogoditi npr: ClassMojiPodaci.Next da se vrti u krug i vraća 1,2,1,2,1.... što zbog moje greške, a što zbog podataka.

Mislim da sam riješio problem (upravo testam):
- sav export sam stavio u jednu proceduru (koja poziva druge prema vrsti podataka)
- kreiram thread u kom u proceduri Execute pozivam svoju proceduru za export
- Timeru kažem kad da se okine, i ako je thread aktivan - napravim Terminate i nakon toga Application.Terminate

Tako se gasi program bez obzira što u tom trenutku radi (bar onaj u kom sam to testirao).
Znam da nije baš najpametnije.... Onako kako radi, mislim da ne može biti štete (bar ne veće)

Izvršavanje programa (ako nema greške) traje cca 2 sata. Probat ću staviti ograničenje na 30 minuta i vidjeti da li će se ugasiti.

Ako ima boljih ideja - bio bih zahvalan.
[ reiser @ 09.07.2014. 15:03 ] @
Ako pozivas proceduru iz threada, i onda okines TThread.Terminate(), to ti nece prekinuti izvrsavanje threada sve dok se izvrsavanje te procedure ne zavrsi. Stavi u toj proceduri proveru da li je thread Terminated posle svake malo vece operacije, npr:

Code:

procedure TMojThread.Work;
begin
  operacija1;
  if Terminated then
    Exit;
  operacija2;
  if Terminated then
    Exit;
  operacija3;
  ...
end;

procedure TMojThread.Execute;
begin
  Work;
end;


Takodje, propisno zatvaranje aplikacije bi bilo otprilike nesto ovako:

Code:

FMojThread.Terminate;
FMojThread.WaitFor;
FMojThread.Free;
Close;


Ovo se podrazumeva da se poziva iz glavne forme.