Fórum Vamos discutir sobre THREAD ? #208698

23/01/2004

0

Pessoal, proponho que neste topico possamos discutir sobre thread algo meio obscuro para muitas pessoas, e que talvez com um pouco de informações de todos possamos sanar a duvida de muitos.


Icheuk

Icheuk

Responder

Posts

23/01/2004

Icheuk

Bom vou abrir a lista:

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


Responder

Gostei + 0

23/01/2004

Paulo

Concordo com vc Ivan, pois poucos trabalham com Thread, por desconhecerem. Thread´s, Processos e etc... São coisas que todos deveriamos estar dominando pelo tempo de programação que muitos já possuem. Um curso de delphi é caro(falo de um bom curso). Então a solucão barata e ótima é este forum.


Responder

Gostei + 0

23/01/2004

Icheuk

Legal paulo e ai voce ja trabalhou com thread, ja fez alguma coisa, ja leu sobre thread?


Responder

Gostei + 0

23/01/2004

Icheuk

Ei pessoal, pelo indice do forum ja entraram varias pessoas, vamos responder colocar aspectos de thread em discussao, estou esperando, vamos la, vamos juntos desvendar thread !

Ivan Cheuk


Responder

Gostei + 0

23/01/2004

Icheuk

Na questao sobre o Free, eu fiz alguns testes e todas as vezes que eu coloco OnFreeTerminate := True e tento colocar ao fechar a thread
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?


Responder

Gostei + 0

23/01/2004

Icheuk

po pessoal, ja entrou um monte de pessoas mas ninguem responde porque?

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.


Responder

Gostei + 0

23/01/2004

Vanius

Nao tenho experiencia com Threads, mas quero aprender.
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


Responder

Gostei + 0

23/01/2004

Icheuk

Legal, vanius.

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


Responder

Gostei + 0

26/01/2004

Icheuk

E ai galera, bom dia e boa semana a todos, e entao vamos continuar a falar sobre thread.

Continuo aguardando, ok.

ICheuk


Responder

Gostei + 0

26/01/2004

Icheuk

:cry: E ai pessoal, ninguem quer discutir sobre thread :?: :cry:

:(


Responder

Gostei + 0

26/01/2004

Icheuk

Bom pessoal, pelo visto ninguem quer discutir sobre thread entao eu estou parando de monitorar o topico.

Agradeço a todos pela ajuda e qualquer coisa me mande um email.

ICheuk


Responder

Gostei + 0

26/01/2004

Osocram

AEeeee

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..


Responder

Gostei + 0

26/01/2004

Osocram

Aproveitando o topico...
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.


Responder

Gostei + 0

26/01/2004

Kroki

To com um problemao.
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.


Responder

Gostei + 0

27/01/2004

Osocram

ve se naum tem uma propriedade ´timeout´... isso faz c q vc se desconecte depois d tanto tempo ocioso.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar