Abortar thread

Delphi

13/04/2005

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 ?


Alexandre_sbo

Alexandre_sbo

Curtidas 0

Respostas

Beppe

Beppe

13/04/2005

Thread.Terminate


GOSTEI 0
Massuda

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.


GOSTEI 0
Alexandre_sbo

Alexandre_sbo

13/04/2005

vlw pela ajuda....
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

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

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

Massuda

13/04/2005

Teoricamente, uma solução mais radical seria usar a função TerminateThread da API do Windows (não testei)...
var
  MinhaThread: TThread;
...
  MinhaThread.Resume;

  // thread em execução

  // "mata" a thread
  TerminateThread(MinhaThread.Handle, 0);
Não sei quais seriam as consequencias de terminar uma operação no BD dessa forma.


GOSTEI 0
Gandalf.nho

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

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

Alexandre_sbo

13/04/2005

vlw Massuda...
[b:6256598bf5]o codigo:[/b:6256598bf5]
TerminateThread(MinhaThread.Handle, 0);

funcionou o form naum fica mais travado.....


GOSTEI 0
Alexandre_sbo

Alexandre_sbo

13/04/2005

olhá eu novamente.....
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

Beppe

13/04/2005

Qual thread criou o form? O que o botão faz?


GOSTEI 0
Alexandre_sbo

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


GOSTEI 0
Beppe

Beppe

13/04/2005

Tente fechar o form e destruí-lo antes de terminar a thread.


GOSTEI 0
Massuda

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

Alexandre_sbo

13/04/2005

cria outro form por exemplo..


GOSTEI 0
Massuda

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

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

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

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.


GOSTEI 0
Alexandre_sbo

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


GOSTEI 0
POSTAR