• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

javac

Duvda em criar thread ou backgroundworker

9 mensagens neste tópico

Boas estou a tentar criar um thread ou backgroundworker para actualizar uma progressbar mas nao estou a conseguir.

Nao sei como fazer...eu crio um backgroundworker mas continua sem funcionar...

Alguem pode colocar um exmplo simples!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O BackgroundWorker é mais ou menos feitos em dois passos que são os mais importantes e para cada um deles existe um evento próprio. O DoWork e o ReportProgressChanged.

No DoWork é onde colocas toda a lógica necessária para calcular o valor que queres mudar na ProgressBar. Quando necessitas de mudar o valor, tens de fazer um worker.ReportProgress() e passas ai o valor novo da ProgressBar.

No evento ReportProgressChanged, vais receber o valor que passaste e ai sim, alteras o valor da ProgressBar. Se o fizeres no evento DoWork vais ter um problema de cross-threading e vai-te resultar numa excepção porque estás a trabalhar com threads diferentes e para modificares valores do que quiseres, tem de ser na mesma thread e é para isso que existe o ReportProgressChanged.

Resumindo é isto que tens de fazer...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Li o que disses-te e fiz o seguinte


//isto ocorre quando click num botao executa o background e o metodo que faz o login vai á base dados etc...
private void button_entrar_Click(object sender, EventArgs e)
        {
            backgroundWorkerProgressBar.RunWorkerAsync();
            entrarLogin();
        }

//metodo do work que avisa
private void backgroundWorkerProgressBar_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            backgroundWorkerProgressBar.ReportProgress(10);
        }

//metodo que recebe o valor e actualiza
        private void backgroundWorkerProgressBar_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
        {
            progressBarLogin.Value = e.ProgressPercentage;
        }

problema só aparece a progress bar a 10 quando o metodo entarLogin() termina

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

entao usa threads.

Ou usa o aplicationDoEvents.

Usando o BackgroundWorker nada disso deveria ser preciso...

Não sei qual será o problema, mas nada disso deveria estar acontecer... :/

No evento DoWork, experimenta colocar este código:

for(int i = 1; i <= 100; i++) {
    backgroundWorkerProgressBar.ReportProgress(i);
    System.Threading.Threads.Sleep(250);
}

O método entrarLogin() deveria ser executado normalmente e no background é suposto a progress bar ir aumentando progressivamente. Se isto não acontecer, algo está errado...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Usando o BackgroundWorker nada disso deveria ser preciso...

Não sei qual será o problema, mas nada disso deveria estar acontecer... :/

No evento DoWork, experimenta colocar este código:

for(int i = 1; i <= 100; i++) {
    backgroundWorkerProgressBar.ReportProgress(i);
    System.Threading.Threads.Sleep(250);
}

O método entrarLogin() deveria ser executado normalmente e no background é suposto a progress bar ir aumentando progressivamente. Se isto não acontecer, algo está errado...

Nao funcionou..obrigado pela dica na mesma...vou ter de pesquisar mais pra ver se encontro o problema

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Verifiquei que se ocorrer uma excepção do tipo utilizador invalido ou nao consegui-o ligar ao servidor durante o metodo entrarLogin() o backgroungworker começa a funcionar mas não sei pk?!

:hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tás trocado  :biggrin:

Tens que fazer o entrarLogin() no BackgroundWorker_DoWork, porque senão acontece algo como isto:

A thread 1, responsável pelo UI, diz que a thread 2 deve começar. (RunWorkerAsync)

A thread 2 começa a executar DoWork e a thread 1 continua na instrução seguinte.

A thread 1 está a executar userLogin(); thread 2 manda uma notificação para a thread 1 actualizar a progressbar

...

...

A thread1 terminou userLogin(). Executar próxima instrução, que é actualizar a progressbar

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E eu acho que é exactamente isso que ele quer e o que o código é suposto fazer...

Pelo que percebi do problema, é que a progressbar só é actualizada quando o método userLogin() terminar e não é isso que é suposto acontecer (acho eu) e não é isso (mais uma vez, acho eu) que o javac quer que aconteça.

EDIT:

Tava aqui a pensar e a ler o que disseste de novo e já estou todo trocado...

Se o método userLogin() não "parar" a thread 1, a progressbar deveria ser actualizada porque a thread 1 chamou-o o userLogin(), eu não sei o que faz este código mas suponho que esteja a espera que o utilizador introduza um username/pass, mas enquanto isso, a thread 1 continua activa (supostamente) e o ReportProgress deveria funcionar.

@javac

Podes colocar ai código do método userLogin() para vermos o que está acontecer dentro dele? O problema deve estar ai...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora