Resultados 1 a 7 de 7
  1. #1

    Smile [Tutorial]MultiThread no Delphi

    Pessoal na verdade não estava com vontade de fazer um Tutorial do tipo pq há muito material na Internet mas a pedido do Acpguedes eu resolvi fazer,então vamos lá.

    Primeiro Metodo:


    Esse metodo é mais aconselhavel aos iniciantes por ser mais simples de entendimento,mas pode ser um pouco mais demorado na hora de Codar.

    No topo da Unit provavelmente vc vera:

    Código:
    TForm1 = Class(TForm)
    Private 
      { Private declarations }
    Public
      { Public declarations }
    End
    ;

    Em cima dessa classe criaremos outra Classe TThread ficando assim :

    [Code]
    ThreadClass = Class(TThread)
    Private
    Protected
    Procedure Execute; OverRide;
    Public
    End;
    TForm1 = Class(TForm)
    Private
    { Private declarations }
    Public
    { Public declarations }
    End


    Como pode ver além de declararmos essa nova Classe ainda declaramos uma Procedure ao Protected,essa Procedure é a parte principal da nossa Thread é nela que iremos colocar os comandos que aconteceram quando nossa Thread for criado,então eu para testar o poder do Multi Threading eu coloquei um Button,e um ProgressBar no Form,se quizer testar podem fazer o mesmo,mas antes vamos declarar a procedure em baixo de "Implementation".

    Código:
    Procedure ThreadClass.Execute;
    Begin
    Repeat
    Sleep(100);
    Form1.ProgressBar1.Position:= Form1.ProgressBar1.Position + 10;
    Until Form1.ProgressBar1.Position = 100;
    End;
    Como podem ver ela possue uma API chamada de Sleep,essa API já foi feita para travar/congelar uma aplicação por um certo tempo e mesmo sendo feito para isso,a aplicação não trava/congela.

    Agora no Evento OnClick do Button adicionaremos:

    Código:
    Var
    Thread: ThreadClass;
    Begin
    Thread:= ThreadClass.Create(True);
    Thread.FreeOnTerminate:= True;
    Thread.Resume;
    End;
    Quando o botão for Clickado o ProgressBar vai chegar a posição maximo(que no nosso caso é 100) e não se tera nenhum travamento.


    Segundo Metodo:

    Esse metodo é mais simples,vamos fazer do mesmo modo,colocar um ProgressBar e um Button no Form,e no Evento OnClick do Button adicionaremos:

    Código:
    Var
    ThreadId: Cardinal;
    Begin
    CreateThread(Nil,0,@ThreadFunction,Nil,0,ThreadId);
    End;
    E agora adicionaremos a função que sera usada por nossa Thread:

    Código:
    Procedure ThreadFunction;
    Begin
    Repeat
    Sleep(100);
    Form1.ProgressBar1.Position:= Form1.ProgressBar1.Position + 10;
    Until Form1.ProgressBar1.Position = 100;
    End;
    Lembre-se de se adicionar em cima do Evento OnClick do Button,por que caso ao contrario o compilador não conseguiria saber onde está a função,outra não expliquei muito,só mostrei como fazer na pratica,pq no Google tem muito material sobre o mesmo,e se quizerem saber mais é só dar um pesquizada.

    Até a proxima

  2. #2
    Hacker Avatar de acpguedes
    Data de Ingresso
    Sep 2011
    Localização
    #!/usr/bin/env perl
    Posts
    955
    era exatamente isso que eu queria...
    Vc consegue fazer uns tuto bem claro e simples... o forum precisa disso!!

    Valeu mesmo por me ajudar, vou testar das duas formas aqui....

    Enfim, parabens!
    So respondo se a consiencia perguntar!!!
    Não Respondo MP's de perguntas, as faça em um tópico!

    Perl User, Bioinformatcs Programmer!

  3. #3
    Um erro crítico no TThread é esquecer de usar a função Synchronize e colocar o que vai interagir com a outra thread (no caso do tutorial a GUI Thread)
    E também não foi abordado semáforos(quando existe uso compartilhado de algum recurso)
    Tem que ter cuidado com deadlocks.
    MP Com dúvidas e pedidos de ajudas serão IGNORADAS
    "Mentes fracas não pensam,corpos fracos não lutam."

    Microsoft Technology Associate: Software Development Fundamentals (C#
    )

  4. #4
    Newbie
    Data de Ingresso
    Aug 2011
    Posts
    116
    Interessante eu estava fazendo o mesmo em um auto-updater meu , porem nao deste modo , irei testar e retornar com o resultado.

  5. #5
    Gray Hat Avatar de CoderSc
    Data de Ingresso
    Jan 2011
    Localização
    #!/bin/bash
    Posts
    1.736
    Citação Postado originalmente por R0Dr1g0. Ver Post
    Um erro crítico no TThread é esquecer de usar a função Synchronize e colocar o que vai interagir com a outra thread (no caso do tutorial a GUI Thread)
    E também não foi abordado semáforos(quando existe uso compartilhado de algum recurso)
    Tem que ter cuidado com deadlocks.
    Caso alguém queira saber mais no Delphi.About fala um pouco mais sobre o mesmo.
    Når du føler flove over at se på tras eller bange for at se fremad, se venstre eller højre I be altid ved din side.

    H
    aters Gonna Hate

  6. #6
    Newbie
    Data de Ingresso
    Aug 2011
    Posts
    116
    Procedure ThreadFunc;
    var x : integer;
    begin
    repeat
    sleep(100);
    x := x + 0;
    inc(x);
    Form1.AdvProgress1.Position:= Form1.AdvProgress1.position + 1;
    form1.Label3.Caption := IntTOsTR(x) + '%';
    until Form1.AdvProgress1.Position = 100;
    end;



    Caso queira uma contagem interagindo com a contagem na label.

  7. #7
    Procedure ThreadFunc;
    var x : integer;
    begin
    repeat
    sleep(100);
    x := x + 0;
    inc(x);
    Form1.AdvProgress1.Position:= Form1.AdvProgress1.position + 1;
    form1.Label3.Caption := IntTOsTR(x) + '%';
    until Form1.AdvProgress1.Position = 100;
    end;



    Caso queira uma contagem interagindo com a contagem na label.
    Algumas coisas são desncessarias,seria melhor fazer assim :

    Código:
    Procedure ThreadFunc;
    Begin
    Repeat
    Form1.ProgressBar1.Position:= Form1.ProgressBar1.Position +1;
    Form1.Label1.Caption:= IntToStr(Form1.ProgressBar1.Position);
    Until Form1.ProgressBar1.Position = 100;
    End;
    Codigo mais limpo e dispensa uso de algumas coisas desnecessarias,como o inteiro que vc usou.

Permissões de Postagem

  • Você não pode iniciar novos tópicos
  • Você não pode enviar respostas
  • Você não pode enviar anexos
  • Você não pode editar suas mensagens
  •