Threads
01/04/2009
0
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
Post mais votado
03/04/2009
O que você deve fazer é simplesmente adicionar o código abaixo no evento load do seu form.
CheckForIllegalCrossThreadCalls = false;
Deve funcionar agora!
Abraço
Knight_of_wine
Mais Posts
20/01/2016
Rodrigo Santos
15/04/2019
Joel Coutinho
Valeu pessoal da DevMedia =)).
17/10/2022
Luigi Nogueira
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.
Clique aqui para fazer login e interagir na Comunidade :)