Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Paulo_phs82

[Resolvido] Thread

Recommended Posts

Olá, estou desenvolvendo uma aplicação que utiliza comunicação Socket, entretanto para não ficar com a aplicação "Travada" enquanto aguardo a conexão utilizo uma Thread. Mas assim que inicio uma thread e ela é terminada os códigos que vem na sequencia não são efetuados e se tento colocar alguma ação em um Button, TextBox ou outro objeto ocorre um erro em tempo de execução.

 

Minha duvida é essa, como fazer com que os códigos que vem depois de uma tread sejam sexecutados ou como fazer com que ós objetos do Toolbox não gerem um erro em tempo de execução.

 

Desde já agradeço a todos....... http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Posta seu código e a excessão que é gerada.

 

Att

Compartilhar este post


Link para o post
Compartilhar em outros sites

a exceção gerada é essa:

Operação entre threads inválida: controle 'txt_Status' acessado de um thread que não é aquele no qual foi criado..

 

o código de exemplo é esse:

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 System.Threading;

namespace wfa_Threading
{
    public partial class Form1 : Form
    {
        private Thread th;
        private ThreadStart ths;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void btn_IniciaCalculo_Click(object sender, EventArgs e)
        {
            ths = new ThreadStart(calculo);
            th = new Thread(ths);
            th.Start();
        }

        private void calculo()
        {

            int itResultado = 0;
            for (int i = 0; i < 100; i++)
            {
                Thread.Sleep(50);
            }
            txt_Status.Text = "Calculo terminado valor = " + itResultado.ToString();
        }
    }
}

Ou seja criei um textBox, crio uma thread para aguardar um conexão socket e quero exibir informações como se ja conectou ou se esta aguardando, mas o usuario tem que usar outras funcionalidades nesse tempo, mas da esse erro.

Estava vendo eventos e delegates para tentar solucionar esse problema.

 

Espero ter explicado claramente minha dificuldade.

ATT

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia a todos consegui resolver meu problema utilizando o timer da thread, e delegate.

 

aqui vai um trecho de código que pode ajudar quem estiver com o mesmo problema que o meu.

 

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;

namespace ExemploThreadTimer
{
    public partial class Form1 : Form
    {
        System.Threading.Timer timer;
        
        public Form1()
        {
            InitializeComponent();
        }

        delegate void passo2(string texto);
        private void InsereTexto(string texto)
        {
            this.richTextBox1.Text = texto + this.richTextBox1.Text;
        }        
        
        void Inicio(object obj)
        {
            Teste st = obj as Teste;
                if (this.InvokeRequired)
                
                   this.Invoke(new passo2(InsereTexto),st.strNome + st.itValor.toString);               
                else 
                    this.richTextBox1.Text = st.strNome;
            }
        }


        private void Form1_Load(object sender, EventArgs e)
        {
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            richTextBox1.Text += "\n" + "é nois mano";           
        }


        private void button2_Click(object sender, EventArgs e)
        {
            timer = new System.Threading.Timer(new System.Threading.TimerCallback(Inicio), new Teste(1,"paulo"),
                    1000, 1000);
        }
    }
    
    
     public class Teste
    {
        public int itValor;
        public string strNome;
        public State(int valor, string strteste)
        {
            itValor += valor;
            strNome =strteste;
        }
    } 
}

 

as partes principais são

--> private void button2_Click

--> void Inicio(object obj)

--> delegate void passo2(string texto);

--> private void InsereTexto(string texto)

 

é só copiar e colar que fa certo mas na tela tem que ter 2 Button e um richTextBox.

Nem precisa renomear.

 

Se alguem souber outras formas de fazer, por favor posta um comentario......

Compartilhar este post


Link para o post
Compartilhar em outros sites

código correto kkkkkk

esse vai funcionar sem erros, não consegui editr o anterior http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

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;

namespace ExemploThreadTimer
{    
    public partial class Form1 : Form    
    {        System.Threading.Timer timer;                
        public Form1()        
        {            
            InitializeComponent();        
        }        
        delegate void passo2(string texto);        
        private void InsereTexto(string texto)        
        {
            this.richTextBox1.Text = texto + "\n" + this.richTextBox1.Text;        
        }
                        
        void Inicio(object obj)        
        {            
            Teste st = obj as Teste;                
            if (this.InvokeRequired)
                this.Invoke(new passo2(InsereTexto), st.strNome + System.DateTime.Now.TimeOfDay.ToString());
            else
                this.richTextBox1.Text = st.strNome + System.DateTime.Now.TimeOfDay.ToString();            
                
        }        
        private void Form1_Load(object sender, EventArgs e)        
        {                    
        }        
        private void button1_Click(object sender, EventArgs e)        
        {            
            richTextBox1.Text += "\n" + "é nois mano";                   
        }        
        private void button2_Click(object sender, EventArgs e)        
        {           
            timer = new System.Threading.Timer(new System.Threading.TimerCallback(Inicio),
                                               new Teste(System.DateTime.Now.TimeOfDay.ToString(), "paulo"),                   
                                               1000, 2000);        
        }
    }         
        public class Teste    
        {
            public string itValor;        
            public string strNome;
            public Teste(string valor, string strteste)        
            {            
                itValor = valor;            
                strNome =strteste;        
            }
        }
}


Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.