Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Excerrar aplicação apos termino da Thread


robinhocne

Pergunta

Eu montei um processo atraves desse exemplo de Thread;

 

procedure TForm2.Button2Click(Sender: TObject);
var MyThread:TThread;
begin

  ProgressBar1.Position := 0;
  ProgressBar2.Position := 0;
  MyThread := TThread.CreateAnonymousThread(procedure var i:integer; begin

  for i := 0 to 100 do
    begin
      TThread.Synchronize(MyThread, procedure begin
        ProgressBar1.Position := i;
        ProgressBar2.Position := i * 2;
      end);
      Sleep(100);
    end;

  end);
  MyThread.Start;

end;

porém agora o que eu preciso saber quando ela terminou para eu fechar a aplicação;

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

Veja a modificação

procedure TForm2.Button2Click(Sender: TObject);
var MyThread:TThread;
begin

  ProgressBar1.Position := 0;
  ProgressBar2.Position := 0;
  MyThread := TThread.CreateAnonymousThread(procedure var i:integer; begin

  for i := 0 to 100 do
    begin
      TThread.Synchronize(MyThread, procedure begin
        ProgressBar1.Position := i;
        ProgressBar2.Position := i * 2;
      end);
      Sleep(100);
    end;

  end);

  MyThread.FreeOnTerminate := True;
  MyThread.OnTerminate := FinalizarRotina; /// aqui voce coloca uma mensagem ou outra coisa
  MyThread.Start;

end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

FinalizaRotina seria o que ?

seria uma procedure para voce encerrar ( terminar )

a thread

 

seria tipo isso:

procedure MyThread.Execute;
begin
    FreeOnTerminate := True;
    while not Terminated do
    begin
        Sleep (10000); // Just an example for take long time.
        Terminate; // This will set Terminated to True, so it won't iterate next time.
    end;
end;

ou  simplesmente

  MyThread.FreeOnTerminate := True;
  MyThread.OnTerminate := MyThread.Terminate;
  MyThread.Start;

ou pode ainda testar se terminou a thread

if MyThread.Terminated then

  

Link para o comentário
Compartilhar em outros sites

  • 0
5 horas atrás, Jhonas disse:

FinalizaRotina seria o que ?

seria uma procedure para voce encerrar ( terminar )

a thread

Então Jhonas, eu abro a aplicação, ai tenho um processo e dentro dele tem essa thread, ai quando o processo terminar (thread) a aplicação deve fechar sozinha....

Link para o comentário
Compartilhar em outros sites

  • 0

vou te passar um exemplo bem simples para voce entender o funcionamento

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
   MinhaThread = class(TThread)
   procedure Execute; override;
   procedure Verifica;
   procedure Fechar;
   Private
   constructor Create();
end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure RotinaX(Sender: TObject);
  private
    { Private declarations }
    Teste: MinhaThread;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

procedure MinhaThread.Execute;
Var Sender : TObject;
begin
   synchronize(Verifica); // Acessar a VCL sem travar o programa
   Form1.RotinaX(Sender); // Executar Rotina ( Procedures )

   while not Terminated do
    begin
        Sleep (100);
        Terminate; // Finaliza a Thread
        Form1.Memo1.Lines.Append('Thread Finalizada');
        synchronize(Fechar); // Fechar o programa
    end;

end;

procedure MinhaThread.Verifica;
begin
   Form1.Caption := 'TESTE';
end;

procedure MinhaThread.Fechar;
begin
   application.terminate; // Fechar o programa
end;

constructor MinhaThread.Create();
begin
  inherited Create(True); { Chama o contrutor herdado. Ele irá temporariamente colocar o thread em estado de espera para depois executá-lo. }
  FreeOnTerminate := True; // Libera o objeto após terminar.
  Priority := tpLower; { Configura sua prioridade na lista de processos do Sistema operacional. }
  Resume; // Inicia o Thread.
  //Terminate;
end;

//================================================================================

procedure TForm1.RotinaX(Sender: TObject);
var i : integer;
begin
    for i := 1 to 100 do
       begin
          Memo1.lines.append(inttostr(i));
          sleep(100);
       end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   teste := MinhaThread.Create(); // Cria a Thread
end;

end.

 

outro exemplo

http://www.planetadelphi.com.br/dica/6353/construindo-threads-com-delphi

abraço

 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,9k
×
×
  • Criar Novo...