nao eu n tava duvidando nao! fiz a pergunta por nao saber mesmo.. queria
saber o motivo..
vou estudar aquele link q me postaram ai depois vou tentar terminar meu
objetivo..

2009/8/28 eliflaviob <elifla...@gmail.com>

>
>
> Simplesmente porque a VCL não é thread safe, e tudo que é visual em um
> programa é feito pela thread principal, isto é fato. Mas veja bem, não quero
> convencer ninguém de nada, só estou tentando ajudar o colega com problemas.
>
> Eu uso threads em muitos lugares, tenho muito benefício com elas e não
> tenho nenhum problema, porque as uso corretamente, inclusive com múltiplas
> conexões com banco de dados. Eu uso também Progress Bar em quase todas as
> threads que utilizo, para o usuário saber em que ponto o processamento está,
> porém, quando vou atualizar o mesmo, chamo o método no Synchronize, senão o
> sistema apresenta uns erros estranhos, que já são esperados pelos motivos
> citados acima.
>
> Mas fica a seu critério fazer da forma que melhor lhe convém.
>
> Eli Flávio Bortolotte
>
> --- Em delphi-br@yahoogrupos.com.br <delphi-br%40yahoogrupos.com.br>,
> Leandro <mutu...@...> escreveu
>
> >
> > pq n pode usar com componente vcl? ja vi exemplo com progress bar q
> > funcionava mesmo concorrendo com o principal..
> > em compensação eu tentei utilizar thread com acesso ao bd e a aplicacao
> > principal mexendo com os componentes visuais.. e mesmo usando componentes
> de
> > conexão ja criados ou a criacao dinâmica a thread nao funcionou como eu
> > esperava e teve concorrencia com a principal dando travamentos.. o
> inverso
> > tbm tentei.. aplicacao conexao com o banco e thread mexendo com o
> visual..
> > dei uma pausa no projeto ai quando estudar mais tento termina-lo
> >
> > 2009/8/27 eliflaviob <elifla...@...>
> >
> > >
> > >
> > > Tudo que eu aprendi sobre threads foi pesquisando em foruns, fuçando,
> > > testando e tirando conclusões. Nunca achei nenhuma documentação
> realmente
> > > interessante. Mas qualquer dúvida manda aí que se eu souber eu
> respondo.
> > >
> > > Eli Flávio Bortolotte
> > >
> > > --- Em delphi-br@yahoogrupos.com.br 
> > > <delphi-br%40yahoogrupos.com.br><delphi-br%
> 40yahoogrupos.com.br>,
>
> > > Fabiano Moura <mctbrasil@> escreveu
> > >
> > > >
> > > > Eli, existe alguns materiais, links, qq coisa sobre Threads que seja
> bom
> > > e
> > > > que possa compartilhar?
> > > >
> > > > Fabiano
> > > >
> > > > 2009/8/26 eliflaviob <eliflavio@>
> > >
> > > >
> > > > > André, usar thread é algo complexo e precisa ser muito bem
> analisado.
> > > > > Nunca execute nada da VCL dentro de uma thread, absolutamente nada.
> > > Você
> > > > > precisa tomar muito cuidado com o banco de dados também, precisa
> ser
> > > uma
> > > > > conexão com o banco exclusiva para a thread, não pode compartilhar
> a da
> > > > > thread principal senão dá pau.
> > > > > Outra coisa, percebi que você roda o único método FExecMethod1
> dentro
> > > do
> > > > > Synchronize, deste jeito não está adiantando nada ter uma thread,
> pois
> > > ela
> > > > > está rodando na thread principal.
> > > > >
> > > > > Este código é de um relatório? O que você poderia colocar na thread
> é a
> > > > > consulta ao banco de dados, pois a montagem do relatório precisa
> ser na
> > > > > thread principal (synchronize) pois senão dá pau.
> > > > >
> > > > > Percebi também que você dispara a thread e fica em looping
> esperando
> > > ela
> > > > > finalizar. Eu faço de outra maneira que considero melhor: passo um
> > > método de
> > > > > referência para a thread para que ela chame após o término. Desta
> forma
> > > eu
> > > > > disparo a thread e libero totalmente o sistema para o usuário.
> Quando
> > > ela
> > > > > termina ela chama o evento dentro do Synchronize, onde eu finalizo
> a
> > > > > operação, destruo a thread e exibo as informações para o usuário.
> Um
> > > outro
> > > > > detalhe muito importante é que a thread só pode ser destruída pela
> > > thread
> > > > > principal, se você destruí-la após terminar o Execute, dentro dela
> > > mesmo,
> > > > > ela não sairá de memória até que o programa seja finalizado.
> > > > >
> > > > > Eli
> > > > >
> > > > > --- Em 
> > > > > delphi-br@yahoogrupos.com.br<delphi-br%40yahoogrupos.com.br><delphi-br%
> 40yahoogrupos.com.br>,
>
> > > André Geraldo dos Santos
> > > > > <andresantos78@> escreveu
> > > > > >
> > > > > > Pessoal,
> > > > > > Bom dia.
> > > > > >
> > > > > > Estou tendo um problema ao executar um processamento dentro de
> uma
> > > > > > thread, meu caso é o seguinte.
> > > > > > Montei uma classe que herda de Thread conforme descrito abaixo.
> > > > > >
> > > > > > Está thread foi criada com o objetivo de separar os
> processamentos
> > > > > > pesados da aplicação principal
> > > > > > evitando travamento, congelamento(Tela branca) entre outros
> problemas
> > > > > na
> > > > > > aplicação durante a excução de determinados processos.
> > > > > >
> > > > > > Pesquisando na internet achei algumas coisas a respeito mas não
> > > > > ajudou
> > > > > > muito, algumas pessoas dizem que neste caso o
> > > > > > metodo deve ser sincrozinado(safe mode) porque qualquer operação
> que
> > > > > > envolva a vcl é considerada como unsafe,
> > > > > > realmente testei e funcionou porém a tela congela do mesmo jeito.
> > > > > >
> > > > > > Meu windows é XP SP3, e notei que no WinXP SP2 isso não acontecia
> até
> > > > > > porque tenho outras implementações onde utilizo
> > > > > > está mesma técnica de thread e funciona perfeitamente.
> > > > > >
> > > > > > O mais estranho é que o processo executa sem problemas quando uso
> > > > > thread
> > > > > > unsafe, mas quando vou fechar a aplicação principal ocorre o
> erro.
> > > > > Algumas
> > > > > > pessoas dizem que o problema pode estar ligado a forma como crio
> e
> > > > > destruo o
> > > > > > form mas já testeis de diversas formas e o erro persiste.
> > > > > >
> > > > > > Aproveitando eu gostaria de saber como vocês tratam exceções
> geradas
> > > > > > dentro de uma thread, devolvendo o controle para aplicação
> principal.
> > > > > >
> > > > > >
> > > > > >
> > > > > > *** Escopo da Classe ***
> > > > > >
> > > > > > type
> > > > > > TProcExec1 = procedure () of object;
> > > > > >
> > > > > > TSistemaThread = Class (TThread)
> > > > > > private
> > > > > > protected
> > > > > > procedure Execute; override;
> > > > > > procedure processaFExecMethod1;
> > > > > > public
> > > > > > FExecMethod1 : TProcExec1;
> > > > > > constructor Create(_Method : TProcExec1); overload;
> > > > > > procedure sisOnTerminate;
> > > > > > function ThreadTerminated : Boolean;
> > > > > > end;
> > > > > >
> > > > > > implementation
> > > > > >
> > > > > > constructor TPharmacyThread.Create(_Method: TProcExec1);
> > > > > > begin
> > > > > > inherited Create(false);
> > > > > > FExecMethod1 := _Method;
> > > > > > FreeOnTerminate := False;
> > > > > > boThreadTerminate := True;
> > > > > >
> > > > > > end;
> > > > > >
> > > > > > procedure TPharmacyThread.Execute;
> > > > > > begin
> > > > > > try
> > > > > > try
> > > > > > Self.Priority := tpNormal;
> > > > > > if Assigned(FExecMethod1) then begin
> > > > > > //Synchronize(processaFExecMethod1);
> > > > > > processaFExecMethod1;
> > > > > > end;
> > > > > > except
> > > > > > {Tratamento}
> > > > > > end;
> > > > > > finally
> > > > > > phOnTerminate;
> > > > > > end;
> > > > > > end;
> > > > > >
> > > > > > procedure TPharmacyThread.phOnTerminate;
> > > > > > begin
> > > > > > FExecMethod1 := nil;
> > > > > > inherited Terminate;
> > > > > > boThreadTerminate := false;
> > > > > > end;
> > > > > >
> > > > > > function TPharmacyThread.ThreadTerminated: Boolean;
> > > > > > begin
> > > > > > result := self.Terminated;
> > > > > > end;
> > > > > >
> > > > > > procedure TPharmacyThread.processaFExecMethod1;
> > > > > > begin
> > > > > > FExecMethod1;
> > > > > > end;
> > > > > >
> > > > > > *** Exemplo de utilização ***
> > > > > >
> > > > > > procedure TFRMRel_Vendas.btnOKClick(Sender: TObject);
> > > > > > var
> > > > > > Thread : TSistemaThread;
> > > > > > begin
> > > > > > criaFormAguarde;
> > > > > > FRMRel_Vendas.Enabled := False;
> > > > > > if rdgTipoRel.ItemIndex = 0 then
> > > > > > Thread :=
> > > > > > TPharmacyThread.Create(preparaRelatorioVendaSelacaoPorItem)
> > > > > > else Thread :=
> > > > > > TPharmacyThread.Create(preparaRelatorioVendaSelecaoPorSaida);
> > > > > > try
> > > > > > try
> > > > > > Thread.Resume;
> > > > > > while (Thread.boThreadTerminate) do begin
> > > > > > Application.ProcessMessages;
> > > > > > end;
> > > > > > except
> > > > > > destroiFormAguarde;
> > > > > > FRMRel_Vendas.Enabled := True;
> > > > > > FreeAndNil(Thread);
> > > > > > end;
> > > > > > finally
> > > > > > destroiFormAguarde;
> > > > > > FRMRel_Vendas.Enabled := True;
> > > > > > FreeAndNil(Thread);
> > > > > > end;
> > > > > > FRMRel_Vendas.Enabled := True;
> > > > > > Application.ProcessMessages;
> > > > > > end;
> > > > > >
> > > > > > Atenciosamente,
> > > > > >
> > > > > > ----------------------------------------------------------
> > > > > > André Geraldo dos Santos
> > > > > >
> > > > > > Analista de Sistemas/Desenvolvedor
> > > > > > Belo Horizonte / Minas Gerais
> > > > > > E-mail : andresantos78@
> > > > > > ----------------------------------------------------------
> > > > > >
> > > > > >
> > > > > > [As partes desta mensagem que não continham texto foram
> removidas]
> > > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > ------------------------------------
> > > > >
> > > > > --
> > > > > <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>
> > > > >
> > > > >
> > > > >
> > > > >
> > > >
> > > >
> > > > [As partes desta mensagem que não continham texto foram removidas]
> > > >
> > >
> > >
> > >
> >
> >
> >
> > --
> > Leandro, MuTukA
> >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
>
>  
>



-- 
Leandro, MuTukA


[As partes desta mensagem que não continham texto foram removidas]

Responder a