Newsgroup: it.comp.lang.delphi
Titolo: Uccidere in maniera istantanea un programma

la mia esigenza č di terminare all'istante il programma non appena succede
"qualcosa".
Appena questo "qualcosa" succede io lancio la Application.terminate, e il
programma viene immediatamente terminato, salvo il caso in cui io sto
eseguendo delle funzioni che ci impiegano diveri secondi per essere portate
a termine. In questo caso la funzione termina e il programma viene terminato
correttamente. Solamente che io VOGLIO che il programma venga terminato
subito, e non dopo il termine di una di queste fuznioni mi sono spiegato?
Come risolvo? C'č una funzione definitiva che faccia questo?
Saluti
Davide

 Come risolvo? C'è una funzione definitiva che faccia questo?
Prova con Halt anche se non è consigliato interrompere bruscamente se hai
risorse allocate.
Antonio

 mi sono spiegato? Come risolvo? 
secondo me dovresti chiudere quelle determinate funzioni in un thread. 
Detto sommariamente: derivi una classe da TThread, la fai partire alla 
creazione o dopo con Create(CreateSuspended: Boolean) e procedure Resume, 
esegui la funzione critica all'intern di un metodo di questa classe, 
verificando costantemente che non sia Terminated o Suspended.
Tutto qui.
E' più difficile da spiegare che da fare.
P.S. se devi aggiornare dei controlli della VCL (come progress bar, label, 
status bar o quan'altro) devi usare Synchronize
-- 
Mauro Falzari 
   [ 
http://digilander.libero.it/mauro.falzari
 ]
 
 "Se guardi nell'abisso, anche l'abisso guarda in te." 
   (Friedrich Nietzsche)

 risorse allocate.
Ok, ci proverò
Grazie
Davide

 status bar o quan'altro) devi usare Synchronize
:) guarda ti ringrazio tanto per la risposta è che il mio stato di
conoscenza di Delphi non arriva a tanto, derivazioni etc...
Speravo ci fosse qualcosa di + immediato :)
Cmq appena riesco mi studio quanto mi hai detto.
Davvero grazie 1000 per la risposta cmq
Saluti
Davide

dimenticavo che c'è anche un altro modo: passare una variabile per 
riferimento alla procedura che esegue i calcoli, come in questo esempio da 
mettere nel codice di una form con due bottoni (btnStart e btnStop).
Il problema è che se vuoi che la form risponda all'input dell'utente (es. 
rispondere alla pressione dei bottoni), devi eseguire quell' 
Application.ProcessMessages che finisce per rallentare il ciclo.
Detto in parole povere, la soluzione con TThread ti evita 
l'Application.ProcessMessages.
{$APPTYPE CONSOLE}
var
  bCancel: Boolean;
procedure Loop(var Cancel: Boolean);
var
  i: Integer;
label
  redo;
begin
redo:
  i:= 0;
  while i < MaxInt do
  begin
    if Cancel then
      Exit;
    Inc(i);
    Writeln(IntToStr(i));
    {if (i mod 20) = 0 then }Application.ProcessMessages;
  end;
  goto redo;
end;
procedure TForm1.btnStopClick(Sender: TObject);
begin
  bCancel:= True;
end;
procedure TForm1.btnStartClick(Sender: TObject);
begin
  bCancel:= False;
  Loop(bCancel)
end;


 Speravo ci fosse qualcosa di + immediato :)
guarda questo (l'avevo fatto per chiarirmi pure io le idee a suo tempo). 
Magari ti può aiutare.
E' una classe derivata da TThread che, se tu gli passi una form qualsiasi 
e una label, cambierà istante x istante lo sfondo della form con tutte le 
sfumature dal rosso al verde sulla form, e l'etichetta mostrerà istante x 
istante la quantità di rosso.
Per chiamare la classe, prendi una form e mettici una label e da qualche 
parte (nell'OnCreate o nell'OnClick di un bottone) mettici questo:
var
  t: MfTest;
begin
  t:= MfTest.Create(True);
  t.FreeOnTerminate:= True;
  t.Form:= Self;
  t.TheLabel:= Label1;
  t.Resume;
end;
+++++++++++++++++++++++++++++++++++++++++++
unit uThread;
interface
uses
  Classes, Forms, Stdctrls;
type
  MfTest = class(TThread)
  private
    FForm: TForm;
    FLabel: TLabel;
  protected
    procedure Execute; override;
    procedure Update;
  public
    property Form: TForm read FForm write FForm;
    property TheLabel: TLabel read FLabel write FLabel;
  end;
implementation
uses SysUtils, Windows;
{ MfTest }
var
  i: Integer;
const
  time = 50;
procedure MfTest.Execute;
begin
  while not Terminated do
    begin
      i:= 0;
      while (i < 255) do
      begin
        Inc(i);
        Synchronize(Update);
        Sleep(time);
      end;
      while (i > 0) do
      begin
        Dec(i);
        Synchronize(Update);
        Sleep(time);        
      end
    end;
end;
procedure MfTest.Update;
begin
  with FForm do
  begin
    Color:= RGB((255 - i),i, 64);
    FLabel.Caption:= IntToStr(i);
    Invalidate;
  end
end;
end.



Gentilissimo, sicuramente risolverò, o con questo metodo, o tramite
l'esempio sopra...
grazie 1000
Saluti
Davide