Avançar para o conteúdo principal

Concorrência parte II

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);
            }
        }
    }

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

Mensagens populares deste blogue

Upgrade do Windows Home para Pro sem formatar

 Há algum tempo que tentava fazer o upgrade do meu Windows 10 da versão Home para a versão Pro, mas chegava sempre a um ponto em que me era solicitado para formatar o sistema e não estava para isso. Finalmente conseguinte seguindo estes passos: - seguinte estes passos  utilizei uma das chaves genéricas para o Windows 10 Pro e fui a Settings > Update & Security > Activation > Change the product key; - após inserir uma das chaves o Windows instala as funcionalidades Pro e pede para reiniciar; - agora tem o Windows Pro mas não está ativado, assim fui ao site urcdkeys  onde comprei uma chave para o Windows Pro por menos de €20; - com essa chave voltei a funcionalidade Change the product key e ativei o Windows; - e pronto, Windows Pro ativado sem formatar ou reinstalar. Importante : eu não tenho nada a ver com o site urcdkeys por isso a vossa experiência pode correr de forma diferente da minha.

Vamos fazer um carro com o Unity 3D

Neste artigo vamos fazer um carro, simples, com o Unity 3D. A ideia é utilizar o motor de física do Unity 3D para simular o comportamento do carro. Os passos a seguir são: [1] - Criar um projeto novo

Tem troco

Para hoje um pequeno programa que dá troco, bem dar não dá mas calcula o troco a dar em função das moedas disponíveis. Neste projeto vamos utilizar o novo Visual Studio 2012. Como era de se esperar vamos iniciar um projeto novo: Agora adicionamos os seguintes elementos:  - um botão para calcular as moedas a dar de troco  - um botão para repor o número de moedas iniciais disponíveis  - uma textbox para introduzir o valor a pagar  - uma textbox para introduzir o valor entregue  - umas labels para informar o utilizador do que deve introduzir e outra para mostrar o troco  - por fim uma grelha para mostrar os valores das moedas e as quantidades disponíveis de cada uma. A janela principal do programa fica assim: Agora o código, primeiro o evento load do formulário, neste vamos definir os valores das moedas e as respetivas quantidades Para guardar estes valores vamos necessitar de uma variável definida ao nível do formulário, logo abaixo da definição da class: Public Class Form1     Public mo