Fórum Vamos discutir sobre THREAD ? #208698
23/01/2004
0
Icheuk
Curtir tópico
+ 0Posts
23/01/2004
Icheuk
Trocando email com outro associado do clubedelphi, surgiu uma duvida pois ao fechar uma thread nos podemos fecha-la com
MinhaThread.Terminate;
E ele falou que seria necessario colocar o
MinhaThread.Free;
E a informação que tenho é que quando o
OnFreeTerminate := True;
Entao a propria thread executa o free, alguem tem alguma informação sobre isto ou outra coisa a respeito de thread pode ser até duvida.
Proponho que nesta oportunidade fornecida pela comunidade Clubedelphi de nos proporcionar este espaço vomos colocar aqui todas as nossas duvidas sobre thread e informações por mais simples que sejam, eu vou tentar ajudar a levantar todos os aspectos, pois estou trabalhando com threads e achei fantastica, e gostaria de levantar todas as informacoes possiveis e assim desmistificar o que é thread, que acredito eu ser muito importante para todos, pois acho que todos um dia ja precisaram desenvolver algo que fosse processado sem parar o andamento do sistema.
Conto com a colaboração de todos.
Um grande abraço a todos, e vamos começar!
Ivan Cheuk
Gostei + 0
23/01/2004
Paulo
Gostei + 0
23/01/2004
Icheuk
Gostei + 0
23/01/2004
Icheuk
Ivan Cheuk
Gostei + 0
23/01/2004
Icheuk
MinhaThread.Terminate;
MinhaThread.Free;
Quando executa o free acontece uma exception, acredito eu que ao ter
OnFreeTerminate como True a propria thread executa o Free.
Alguem teria alguma informação a respeito.
Ou outra duvida ou qualquer coisa que seja a respeito de Thread, nao fiquem acanhados de perguntar vamos gerar as respostas juntos, alguem tem duvido do que é Thread?
Gostei + 0
23/01/2004
Icheuk
Se a pessoa sabe mais do que foi discutido aqui entao poderia responder para passar mais algumas informacoes.
Mas se caso a pessoa nao sabe nada ou nao sabe muito entao deve ter duvidas, logo tera perguntas entao vamos postar as dicas ou as perguntas, vamos la estou esperando.
Segue abaixo um texto sobre thread bem interessante:
Hoje vamos falar um pouco sobre sincronia de processos usando a classe TThread
fornecida pelo Delphi que permite fazer o controle dos processos em nossos
sistemas.
No nosso dia-a-dia surgem situações em que uma determinada tarefa não pode
esperar que outra tarefa seja terminada por completo para iniciar, sendo assim,
precisamos ter mais de um processo sendo executado pelo processador
simultaneamente. Quando estamos trabalhando com processamento paralelo tudo bem,
caso contrário, temos que usar técnicas de sincronismo para torna isso possível.
A classe TThread é uma classe abstrata, por isso nunca é utilizada diretamente e
sim através de uma subclasse dela, que por sua vez utiliza recursos da classe
base, neste caso a TThread.
Vejamos a seguir um exemplo clássico de representação de Thread, onde
trabalharemos com um formulário, três barras de progresso, que representarão o
multiprocessamento e, dois botões de comandos básicos. A tela fica algo parecido
como a seguinte:
Temos nessa nossa pequena aplicação duas procedures:
· AdicionarProgresso(Barra: TProgressBar) – para adicionar progressos a barra de
progresso passada como parâmetro até ser completada;
· TForm1.Button1Click(Sender: TObject) – para iniciar o preenchimento das
barras.
Veja o código a seguir de cada uma delas:
procedure AdcionarProgresso(Barra: TProgressBar);
begin
while Barra.Position < Barra.Max do
Barra.StepBy(1);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ProgressBar1.Position := 0;
ProgressBar2.Position := 0;
ProgressBar3.Position := 0;
AdcionarProgresso(ProgressBar1);
AdcionarProgresso(ProgressBar2);
AdcionarProgresso(ProgressBar3);
end;
Rode a aplicação e observe o resultado.
Veja que cada ProgressBar atualiza o valor da propriedade Position
individualmente, ou seja, somente após a conclusão do preenchimento a primeira
ProgressBar é que a segunda inicia seu preenchimento e o preenchimento da
terceira, conseqüentemente, só depois da segunda ter sido totalmente preenchida.
Para que possamos fazer com que as barras sejam preenchidas simultaneamente,
devamos usar o conceito de Threads.
Varemos como fazer isso na próxima semana. Até lá!
Um abraço.
Usando Threads – Parte Final
Número da coluna: 21
Data: 24/06/2003
Olá pessoal.
Vamos dar continuidade ao assunto de Threads que demos início na coluna
anterior.
Como já vimos, a classe TThread é uma classe abstrata, não podendo ser utilizada
diretamente e sim através de uma subclasse dela. Temos, assim, a necessidade de
derivar uma nova classe, tendo como classe base a classe TThread e, então,
implementar o método Execute.
Vamos por isso em prática:
1. Selecione o menu File | New | Other;
2. Selecione Thread Object na guia New conforme a figura abaixo;
3. Será então exibida uma nova janela New Thread Object, onde deve ser digitado
o nome da classe que representa nosso novo processo. Se você estiver usando o
Delphi 7 será exibida uma janela igual a seguinte, onde deve ser preenchido
apenas o campo Class Name, caso esteja utilizando uma versão anterior será
exibida alguma janela semelhante
4. Será então gerada um esqueleto com a unidade da nossa nova classe.
A definição do método Execute é tão importante que foi gerada automaticamente,
assim como também um comentário que o ajuda a implementar o método, comentário
este que, evidentemente, pode ser retirado sem nenhum problema.
Este comentário ainda nos informa que alterações de propriedades e chamadas de
métodos aos componentes da VCL (Visual Component Library), somente podem ser
feitas mediante o método Synchronize. Sendo assim qualquer método que altere uma
propriedade de um objeto da VCL deve ser chamado passando seu nome como
parâmetro do método Synchronize da nova classe.
Vejamos a seguir como ficam as unidades prontas com seus respectivos comandos:
Unidade do Formulário
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
ProgressBar1: TProgressBar;
ProgressBar2: TProgressBar;
ProgressBar3: TProgressBar;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure AdcionarProgresso(Barra: TProgressBar);
begin
while Barra.Position < Barra.Max do
Barra.StepBy(1);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ProgressBar1.Position := 0;
ProgressBar2.Position := 0;
ProgressBar3.Position := 0;
AdcionarProgresso(ProgressBar1);
AdcionarProgresso(ProgressBar2);
AdcionarProgresso(ProgressBar3);
end;
procedure TForm1.Button2Click(Sender: TObject);
var Barra1, Barra2, Barra3: TMeuThread;
begin
ProgressBar1.Position := 0;
ProgressBar2.Position := 0;
ProgressBar3.Position := 0;
Barra1 := TMeuThread.Criar(ProgressBar1);
Barra2 := TMeuThread.Criar(ProgressBar2);
Barra3 := TMeuThread.Criar(ProgressBar3);
end;
end.
Unidade do Thread
unit Unit2;
interface
uses
Classes, ComCtrls;
type
TMeuThread = class(TThread)
private
BarraProgresso: TProgressBar;
protected
procedure Execute; override;
procedure Incrementa;
public
constructor Criar(Barra: TProgressBar);
end;
implementation
constructor TMeuThread.Criar(Barra: TProgressBar);
begin
Create(False);
BarraProgresso := Barra;
FreeOnTerminate := True;
end;
procedure TMeuThread.Execute;
begin
while BarraProgresso.Position < BarraProgresso.Max do
Synchronize(Incrementa);
end;
procedure TMeuThread.Incrementa;
begin
BarraProgresso.StepBy(1);
end;
end.
Gostei + 0
23/01/2004
Vanius
Parece q vc consegue executar duas ou mais coisas ao mesmo tempo.
Algo q aprendi, ´meio´ parecido com isto (de certa forma) é q colocando o Application.ProcessMessage; no meio de loops, whiles, ou rotinas q ´demoram´, sempre q o user apertar Ctrl+Alt+Del, seu prog. sempre continuará mostrando ´executando´ ao invés de ´nao respondendo´.
Um amigo me enviou um exemplo de como trabalhar. No Delphi 3 e 5 tambem temos exemplos. c:\(pasta delphi)\exemples\Thread.
Se vcs puderem enviar mais exemplos, ficarei muito agradecido.
Abraços,
Vanius
Gostei + 0
23/01/2004
Icheuk
O conceito de thread é o seguinte:
Se voce tiver uma maquina com mais de um processador e trabalhar com thread, cada thread que voce executar vai para um processador, ou seja é o mesmo conceito do windows multi-processado, porem como a grande maioria trabalha com maquinas com um unico processador apenas usamos o conceito de multi-tarefas, ou seja cada thread vai concorrer por um tempo de processador, sendo assim nos temos como dar prioridades para determinadas threads e tirar a prioridade de outras, e desta forma nossa aplicacao nunca fica parada pois mesmo com sistemas administrativos, acredito eu que todos ja tiveram aquelas rotinas que acabam demorando muito e o micro fica parado, ou um relatorio, desta forma podemos executar a tarefa em uma thread e deixar a aplicacao livre para o usuario continuar a trabalhar e no final o micro pode informar o mesmo que a tarefa ja foi concluida, ufa, acho que é isto, alguem saberia me dizer se em uma rede a thread é rodada no servidor ou local ou se temos condições de definir o local de execução da mesma ?
Legal vanius, vamos continuar o debate, acredito eu que seja desta forma que vamos juntos desenvolver melhores conhecimentos de determinadas propriedades desta ferramenta fantastica chamada Delphi.
ICheuk
Gostei + 0
26/01/2004
Icheuk
Continuo aguardando, ok.
ICheuk
Gostei + 0
26/01/2004
Icheuk
:(
Gostei + 0
26/01/2004
Icheuk
Agradeço a todos pela ajuda e qualquer coisa me mande um email.
ICheuk
Gostei + 0
26/01/2004
Osocram
Fiquei um bom tempo sem aparece no forum ... estou voltando agora...
Bom sobre isso eu naum sei mto... mas gostaria d aprender tbm...
Achei interessante o ex. acima...
Bom.. gostaria d falar p naum desistir... sempre q alguem tiver algum ideia continuar postando aqui... eu vou comecar a mecher tbm..
Gostei + 0
26/01/2004
Osocram
sera q naum tem como eu aproveitar uma unit do meu prog q funca normal p fazer funcar em multiThread?
ahh vou ver se acho um fonte q eu tinha aqui c multiThread. dae eu posto aqui o fonte.
Gostei + 0
26/01/2004
Kroki
Estou usando o Demo do delphi sobre chat na net usando Thread.
Alguem sabe oque preciso implementar para quando eu enviar uma messangem pra um IP e esse IP nao estiver disponivel,meu programa nao ficar ´travado´esperando uma resposta?
Se alguem nao entendeu,é só usar o demo do NetChat e mandar algo para um IP nao exeistente.
Gostei + 0
27/01/2004
Osocram
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)