Continuando o assunto das THREADS ...
Durante a execução de threads pode ser necessário garantir que uma thread conclua a sua tarefa para que outra possa continuar.
Isso é possível com recurso ao método Join da classe Thread, chamando este método pára a execução da thread corrente, ou seja, a thread que chamou o método, até que termine a thread sobre a qual se chamou o método.
Por vezes este método pode provocar resultados inesperados especialmente se chamado a partir da thread principal do programa uma vez que a interface deixa de responder, incluindo os próprios timers.
Neste programa o botão Iniciar demo corre o seguinte código:
obj_teste = new teste(); //objecto com código da thread
thr_teste = new Thread(new ThreadStart(obj_teste.executa)); //nova thread criada
this.timer1.Enabled = true; //activar o timer para ver o estado da thread
//vamos iniciar a thread
thr_teste.Start();
this.label3.Text="Em execução!";
Application.DoEvents(); //permite que a aplicação actualize a interface
if (this.checkBox1.Checked) //activar o join sim ou não?
{
//vamos esperar que termine
//nem o timer é chamado
thr_teste.Join();
}
////quando termina continua aqui
this.label3.Text="Terminado!";
Application.DoEvents();
O código da classe Teste é muito simples
public class teste
{
public int valor;
public teste()
{
valor = 0;
}
public void executa()
{
for (int i = 0; i <= 100; i++)
{
valor = i;
Application.DoEvents();
Thread.Sleep(100);
}
}
}
Durante a execução de threads pode ser necessário garantir que uma thread conclua a sua tarefa para que outra possa continuar.
Isso é possível com recurso ao método Join da classe Thread, chamando este método pára a execução da thread corrente, ou seja, a thread que chamou o método, até que termine a thread sobre a qual se chamou o método.
Por vezes este método pode provocar resultados inesperados especialmente se chamado a partir da thread principal do programa uma vez que a interface deixa de responder, incluindo os próprios timers.
Neste programa o botão Iniciar demo corre o seguinte código:
obj_teste = new teste(); //objecto com código da thread
thr_teste = new Thread(new ThreadStart(obj_teste.executa)); //nova thread criada
this.timer1.Enabled = true; //activar o timer para ver o estado da thread
//vamos iniciar a thread
thr_teste.Start();
this.label3.Text="Em execução!";
Application.DoEvents(); //permite que a aplicação actualize a interface
if (this.checkBox1.Checked) //activar o join sim ou não?
{
//vamos esperar que termine
//nem o timer é chamado
thr_teste.Join();
}
////quando termina continua aqui
this.label3.Text="Terminado!";
Application.DoEvents();
O código da classe Teste é muito simples
public class teste
{
public int valor;
public teste()
{
valor = 0;
}
public void executa()
{
for (int i = 0; i <= 100; i++)
{
valor = i;
Application.DoEvents();
Thread.Sleep(100);
}
}
}
Este código é só para alterar o valor da progress bar.
Depois de testar o programa é possível verificar que com o join activado a interface só responde quando a thread termina, não permitindo a utilização de nenhum objecto mesmo as simples textbox's.
Comentários
Enviar um comentário