Threads

6 respostas
A

Pessol meu problema é o seguinte:
Tenho um formulário pricipal no qual contém um botão,quando o usuário acessa este botão eu crio a instância de uma classe que se chama ExportarBD e uso o método ExSP() , este método exporta dados de um B D para outro …isso demora uma eternidade…não sei como implementar uma thread aí e muito menos pôr uma JProgressBar Junto!
Por favor me ajudadem!!!

public void actionPerformed(ActionEvent e ) {

ExportarBD exportar = new ExportarBD();
       exportar.ExSP();

}

6 Respostas

T

nao eh a melhor solução do mundo, mas vc pode fazer assim:

public void actionPerformed(ActionEvent e ) { Thread thread = new Thread (new Runnable () { exportar.ExSP(); }); thread.start(); }

soh q essa não é a solução mais bonita do mundo… ah eh, marque o método ExSP como synchronized caso ele seja exclusivo…
se vc quiser colocar um JProgressBar, é melhor criar uma classe que implementa Runnable e colocar lah o controle da JProgressBar

L

aproveitando o tópico o que tenho é parecido e fiz o controle dentro da thread só que não atualiza, alguém tem idéia do que esta acontecendo, tipo eu passo como parâmetro para a thread a jprogressbar que quero atualizar só que ela não atualiza, mesmo usando a maneira mais “grossa” setvisible(false) depois setvisible(true);

cleiton_herrmann

boa tarde!
Alex Wds, irei demonstrar o uso de uma thread da
maneira que eu acho mais facil, primeiro sua classe deverá ter no cabeçalho a
implementação de Runnable e sua classe também deverá ter o método
abstrato Run(); então ficaria ± assim:

public class classeComThread implements Runnable {

codigo

public void actionPerformed(ActionEvent e) {

Thread t = new Thread();

t.start(this);

}

public void Run() {
//aqui vai o seu método de persistencia

ExportarBD exportar = new ExportarBD(); 
  exportar.ExSP();

}

}

no método actionPerformed do botao, foi instanciado um objeto do tipo Thread, logo após esse objeto foi iniciado através do método start, e é passado por parametro a instancia da classe, entao quando iniciado, ele chama automaticamente o método abstrato Run(); e entao executa seus métodos de persistencia.

O progressBar poderia ser usado da seguinte maneira.
vou dar um pequeno exemplo, acho que deverá clarear. Bom, depois de devidamente declarado o progressBar, poderia ser feito ± assim:

for (i = 0; i < 100; i++) {

progressBar.setValue(i);

}

esse laço nao seria visivel, pois a tela congelaria se feito dessa maneira, e só veriamos o progressBar jah preenchido completamente. Para resolver isso, poderiamos colocar esse laço em uma Thread para que ele seja executado “em paralelo” com a Thread principal do seu programa. Porém esse método para setar o valor do progressBar, pode ser colocado no final do seu método de persistencia de maneira que a cada registro transferido ele atualizasse um determinado valor no progressBar.

E quanto ao problema do LionRick, eu acho que se vc passar um (this), referencia da sua classe que está chamando a thread, ao invés de passar a jprogressbar, no método start que inicia sua thread, resolveria seu problema.

Espero ter ajudado, qualquer duvida perguntem novamente, respondo assim que puder. t+

L

o problema que esse método run esta como uma inner class e se usar o this ele referência a thread e não a classe pricipal do programa, mas se escrever o run em uma classe separada, fugira o meu objetivo que é de invocar um método de um objeto em uma thread, por exemplo usar uma thread para chamar um método de uma classe qualquer e que esse método também preenche a jprogressbar.

cleiton_herrmann

bom dia lionrick, quero pedir desculpas, pois ainda nao intendi exatamente o seu problema, mais pelo que intendi, vc está tendo problemas nas referencias de suas classes interna e principal na hora de iniciar a thread, tente usar esse seu método Run que está como inner class(isso que nao ficou muito claro) como sendo static, e inicie a thread de outro método static fora da inner class.
Seria melhor se vc colocasse seu código pra nós podermos intender com mais facilidade.

Estou aguardando, t+

L

o problema foi resolvido, o que acontecia que estava instanciando a jprogressbar dentro da inner class, sendo assim não era a minha jprogressbar, sem querer havia criado outra jprogressbar, a solução foi instanciar a jprogressbar por fora da inner class, foi um erro infantil, mas que fui levado pelas regalias do eclipse e fiquei mau acostumado.

Criado 21 de junho de 2005
Ultima resposta 19 de jun. de 2006
Respostas 6
Participantes 4