Eli, existe alguns materiais, links, qq coisa sobre Threads que seja bom e que possa compartilhar?
Fabiano 2009/8/26 eliflaviob <elifla...@gmail.com> > 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, André Geraldo dos Santos > <andresanto...@...> 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 : andresanto...@... > > ------------------------------------------------------------ > > > > > > [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]