Abortar thread
Olá amigos estou com um problema com threads.
É o seguinte no on activate do meu form executo uma thread que dá um refresh em algumas tabelas, está funcionando legal,porém, se thread naum acabou de executar(tipo ela tá dando refrest em uma tabela que demora uns 6 segundos ) e eu mandar fechar o form minha aplicação trava. A duvida é o seguinte como faço pra abortar essa minha thread no close desse form ?
É o seguinte no on activate do meu form executo uma thread que dá um refresh em algumas tabelas, está funcionando legal,porém, se thread naum acabou de executar(tipo ela tá dando refrest em uma tabela que demora uns 6 segundos ) e eu mandar fechar o form minha aplicação trava. A duvida é o seguinte como faço pra abortar essa minha thread no close desse form ?
Alexandre_sbo
Curtidas 0
Respostas
Beppe
13/04/2005
Thread.Terminate
GOSTEI 0
Massuda
13/04/2005
Como o Beppe escreveu, você pode executar no seu form principal o método Terminate da sua thread e [b:905fe661ed]dentro do método Execute[/b:905fe661ed] da sua thread você verifica se a propriedade [b:905fe661ed]Terminated[/b:905fe661ed] está True; se estiver, você deve interromper a execução da thread.
Geralmente não tem como interromper um processo envolvendo BD (especialmente BD SQL). Isso significa que o seu problema, a princípio, não tem solução.
Uma alternativa seria exibir um aviso para o usuário do tipo ´Encerrando o programa´ enquanto a thread não encerra.
Geralmente não tem como interromper um processo envolvendo BD (especialmente BD SQL). Isso significa que o seu problema, a princípio, não tem solução.
Uma alternativa seria exibir um aviso para o usuário do tipo ´Encerrando o programa´ enquanto a thread não encerra.
GOSTEI 0
Alexandre_sbo
13/04/2005
vlw pela ajuda....
o Terminated e Terminate eu já conhecia e o meu problema é o que o massuda disse:
só mais uma duvida rapida, o ibexpert tem um esquema que rola em thread um script e tem a opção de abortar . Será que tem como abortar um execução sql ? Se alguém souber por favor me de um toque...
o Terminated e Terminate eu já conhecia e o meu problema é o que o massuda disse:
Geralmente não tem como interromper um processo envolvendo BD (especialmente BD SQL). Isso significa que o seu problema, a princípio, não tem solução.
só mais uma duvida rapida, o ibexpert tem um esquema que rola em thread um script e tem a opção de abortar . Será que tem como abortar um execução sql ? Se alguém souber por favor me de um toque...
GOSTEI 0
Beppe
13/04/2005
Não sei se esta é uma boa dica, mas pode chamar Halt; que encerra o programa. Não sei quais consequencias terá no BD, pq o término é sem ´aviso-prévio´. Código de [b:77a42f3315]finalization[/b:77a42f3315] não será mais executado após esta chamado, então atenção.
GOSTEI 0
Alexandre_sbo
13/04/2005
VLW pela dica Beppe , mas meu problema é que naum posso terminar o programa, e sim tirar o form que está rodando a thread da memoria....
GOSTEI 0
Massuda
13/04/2005
Teoricamente, uma solução mais radical seria usar a função TerminateThread da API do Windows (não testei)...Não sei quais seriam as consequencias de terminar uma operação no BD dessa forma.
var MinhaThread: TThread; ... MinhaThread.Resume; // thread em execução // "mata" a thread TerminateThread(MinhaThread.Handle, 0);
GOSTEI 0
Gandalf.nho
13/04/2005
Não entendo muito de threads, mas não seria possível impedir o fechamento do form enquanto a thread não terminasse?
GOSTEI 0
Massuda
13/04/2005
...não seria possível impedir o fechamento do form enquanto a thread não terminasse?
Seria outra forma de abordar o problema... se for uma única thread, dá para usar uma flag global que poderia ser atualizada, por exemplo, no evento OnTerminate da thread ou no término do método Execute da thread. Essa flag seria usada no evento OnCloseQuery do form.GOSTEI 0
Alexandre_sbo
13/04/2005
vlw Massuda...
[b:6256598bf5]o codigo:[/b:6256598bf5]
funcionou o form naum fica mais travado.....
[b:6256598bf5]o codigo:[/b:6256598bf5]
TerminateThread(MinhaThread.Handle, 0);
funcionou o form naum fica mais travado.....
GOSTEI 0
Alexandre_sbo
13/04/2005
olhá eu novamente.....
entaum o codigo :
fechou o form sem travar a aplicação, só que dai se eu tenho outro form aberto e tentar clicar em um botao por exemplo, quando ele clico no botao trava a aplicação...
entaum o codigo :
TerminateThread(MinhaThread.Handle, 0);
fechou o form sem travar a aplicação, só que dai se eu tenho outro form aberto e tentar clicar em um botao por exemplo, quando ele clico no botao trava a aplicação...
GOSTEI 0
Beppe
13/04/2005
Qual thread criou o form? O que o botão faz?
GOSTEI 0
Alexandre_sbo
13/04/2005
o form do botao naum tem thread ....é uma aplicação mdi
e o form do botao já estava aberto ,quando abortei a thread do outro form, e qq coisa que eu fizer no botao trava
e o form do botao já estava aberto ,quando abortei a thread do outro form, e qq coisa que eu fizer no botao trava
GOSTEI 0
Beppe
13/04/2005
Tente fechar o form e destruí-lo antes de terminar a thread.
GOSTEI 0
Massuda
13/04/2005
...e o form do botao já estava aberto ,quando abortei a thread do outro form, e qq coisa que eu fizer no botao trava
O que esse botão faz?GOSTEI 0
Alexandre_sbo
13/04/2005
cria outro form por exemplo..
GOSTEI 0
Massuda
13/04/2005
cria outro form por exemplo..
O que você descreve é muito vago. Meu palpite é que esse botão aciona algo relacionado com BD e que ao matar a thread o sistema de acesso ao BD (BDE, dbExpress, etc) foi para o espaço. Mas você teria de ser mais específico para poder ter uma resposta mais concreta.GOSTEI 0
Alexandre_sbo
13/04/2005
é isso mesmo qq coisa que eu faça com o acesso a banco depois de abortara thread trava minha aplicação...
GOSTEI 0
Massuda
13/04/2005
é isso mesmo qq coisa que eu faça com o acesso a banco depois de abortara thread trava minha aplicação...
Então não tem jeito... como eu escrevi lá atrás...Não sei quais seriam as consequencias de terminar uma operação no BD dessa forma.
Provavelmente essas é uma daquelas coisas que a gente tem que conviver...
Geralmente não tem como interromper um processo envolvendo BD (especialmente BD SQL). Isso significa que o seu problema, a princípio, não tem solução.
...a não ser que o sistema de acesso ao BD que você está usando (BDE, dbExpress, etc) permita abortar uma operação em andamento no BD, mas aí já é um assunto que eu não entendo muito.GOSTEI 0
Beppe
13/04/2005
Eu tb naum sou um expert na área de BD, mas acho que nenhum permite abortar uma quey. Eu acho que o que o IBE é um pseudo-abortar: ele espera terminar a query, apenas pára de exibir os resultados.
Se vc conseguir separar a query do controle data-aware, acho que seria a solução. A query fica executando no servidor, e seus resultados são exibidos no controle quando terminar(e o form não tiver sido fechado ainda). Espero que me tenha feito entender.
Se vc conseguir separar a query do controle data-aware, acho que seria a solução. A query fica executando no servidor, e seus resultados são exibidos no controle quando terminar(e o form não tiver sido fechado ainda). Espero que me tenha feito entender.
GOSTEI 0
Alexandre_sbo
13/04/2005
vlw amigos....
Bom acho queo problema naum é na thread mesmo.....
Vou dar uma pesquisada sobre BD e se descobrir alguma coisa, mando pra vcs....
Bom acho queo problema naum é na thread mesmo.....
Vou dar uma pesquisada sobre BD e se descobrir alguma coisa, mando pra vcs....
GOSTEI 0