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]