Threads

.NET

01/04/2009

Olá!

Sou novato em c#, venho do Java e estou tendo algumas dificuldades para entender o funcionamento e permissões das threads em c.

Estou fazendo um aplicativo para um cliente, e resolvi mudar de linguagem, então resolvi mergulhar no C.

O meu problema é o seguinte, tenho um Form de login com o MySQL e gostaria de criar 2 threads. Uma para fazer a conexão sem travar o Form e outra para a progressBar.

O código segue abaixo:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ControleGeral_DB;
using System.Threading;

namespace ControleGeral
{
    public partial class Logar : Form
    {
        private MainMDI mdi;
        
        public Logar(MainMDI mdi)
        {
            InitializeComponent();
            this.mdi = mdi;
            
        }

        private void bLogar_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(new ThreadStart(logar));
            Thread threadBar = new Thread(new ThreadStart(bar));
            thread.Start();
            threadBar.Start(); 
        }

        private void bar()
        {
            barra.Value = 50;
        }

        private void logar()
        {
            try
            {
                Loggin.start(tUsuario.Text, tSenha.Text, BS.Util.Conf.Conf.Instance.getValue("database"), BS.Util.Conf.Conf.Instance.getValue("ip"));
            }
            catch (System.Exception exception)
            {
                MessageBox.Show("Nome de usuário ou senha inválida!");
                return;
            }

            MessageBox.Show("Bem vindo " + tUsuario.Text + "!");
            mdi.Text = "Controle Geral - BS Soluções Tecnológicas #" + tUsuario.Text + "";
            this.Close();
        }

        
    }
}



Bom, como resultado, em tempo de execução tenho o seguinte erro:

[list:b58f14f3a5]Operação entre threads inválida: controle ´barra´ acessado de um thread que não é aquele no qual foi criado.[/list:u:b58f14f3a5]

E através de testes vi que é quando o programa chega nas seguintes linhas:

barra.Value = 50;


mdi.Text = "Controle Geral - BS Soluções Tecnológicas " + tUsuario.Text + "";


 this.Close();


Fico muito grato pela ajuda que me derem.


Giovanibarili

Giovanibarili

Curtidas 0

Melhor post

Knight_of_wine

Knight_of_wine

03/04/2009

Salve salve!

O que você deve fazer é simplesmente adicionar o código abaixo no evento load do seu form.

CheckForIllegalCrossThreadCalls = false;


Deve funcionar agora!

Abraço


GOSTEI 3

Mais Respostas

Rodrigo Santos

Rodrigo Santos

01/04/2009

cara, estava com o mesmo problema, funcionou perfeitamente sua sugestão, obrigado pela dica.
GOSTEI 0
Joel Coutinho

Joel Coutinho

01/04/2009

Muito obrigado pelo post aqui colocado pelo DevMedia, cara estava com o mesmo problema e este comando me salvou, CheckForIllegalCrossThreadCalls = false;.
Valeu pessoal da DevMedia =)).
GOSTEI 0
Luigi Nogueira

Luigi Nogueira

01/04/2009

Muito obrigado pelo post aqui colocado pelo DevMedia, cara estava com o mesmo problema e este comando me salvou, CheckForIllegalCrossThreadCalls = false;.
Valeu pessoal da DevMedia =)).


Gente, cuidado ao usar o CheckForIllegalCrossThreadCalls = false;.
O meu mentor me instruiu a usar somente quando for necessário, ele não corrige o erro citado, o Check força uma Thread errada.]
Estou com o mesmo erro em tela, mas fui instruído a fazer por Delegates e Invoke.
GOSTEI 0
POSTAR