Jump to content
maurosmartins

[Resolvido] Gui e Threads

Recommended Posts

maurosmartins

Olá a todos,

esta pergunta deve ser fácil, mas nao estou a conseguir lá chegar. Estou a tentar criar um pequeno GUI que cria uma thread que tem um ciclo e de segundo a segundo lança um evento e era suposto actualizar uma textbox.

No entanto... Está a causar-me uma excepção dizendo que estou a actualizar o GUI de outra thread.

o código que tenho é o seguinte:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;

namespace guiEvent
{

class ClasseQueVaiGerarEventos{

 public delegate void funcaoaserchamada(object produtor,EventArgs args);
 public event funcaoaserchamada evento;

 public void ciclo(){
Thread.Sleep(1000);
evento(this,new EventArgs());
 }

}


/// <summary>
/// Description of MainForm.
/// </summary>
public partial class MainForm : Form
{
 public MainForm()
 {
  //
  // The InitializeComponent() call is required for Windows Forms designer support.
  //
  InitializeComponent();

  //
  // TODO: Add constructor code after the InitializeComponent() call.
  //
 }

 void MainFormLoad(object sender, EventArgs e)
 {

  ClasseQueVaiGerarEventos classegeradora = new ClasseQueVaiGerarEventos();
  classegeradora.evento+= new ClasseQueVaiGerarEventos.funcaoaserchamada(ActualizaGui);

  Thread threadciclo;

  threadciclo = new Thread(new ThreadStart(classegeradora.ciclo));

  threadciclo.Start();

  textBox.Text="Init";

  //ActualizaGui(this,new EventArgs());

 }

 private void ActualizaGui(object produtor, EventArgs args){
  textBox.Text="FUNCIONOU";  
 }
}
}

se me puderem dar uma ajuda a perceber o que se passa agradecia.

Cumprimentos, Mauro.

Share this post


Link to post
Share on other sites
maurosmartins

Olá bioshock,

desde já obrigado pela resposta, o teu artigo está mto porreiro, mas mesmo assim nao percebo pq é que o meu código nao funciona.

Pensava que ele ia criar a thread e lançar o evento e o método que vai ser chamado em resposta a esse evento devia estar na thread do GUI... parece que não está, porque?

Podes explicar no meu codigo?

Cumps, Mauro.

Share this post


Link to post
Share on other sites
bioshock

Se lesses o artigo em condições vias que lá falo do teu problema, Vê os dois primeiros quotes do artigo.

E depois mais abaixo dou a solução:

/* And here goes the validation code for processing information for different threads */

textBox1.Invoke((MethodInvoker) delegate { textbox1.Text = dR[0].ToString(); });

Share this post


Link to post
Share on other sites
maurosmartins

Viva,

sim eu vi que falavas do meu problema, mas nesta solução estás a criar um método anónimo certo?

não dá para escolher qual a função a ser chamada?

Mauro.

Estou a confundir isto...

essa parte que me deste já é dentro do método que é chamado em resposta ao evento.

Vou pesquisar mais um pco!

Cumps, Mauro.

Share this post


Link to post
Share on other sites
maurosmartins

Viva,

andei a ler mais umas coisas e continuo confuso,

apesar de com o invoke funcionar, nao sei pq preciso dele.

o método de resposta ao evento não corre na mesma thread do gui?

Cumps, Mauro.

Share this post


Link to post
Share on other sites
nelsonr

Os controlos têm de ser atualizados pelo thread que os criou.

O invoke faz isso mesmo, manda o thread do controlo executar um código.

Share this post


Link to post
Share on other sites
maurosmartins

Olá nelsonr,

sim eu percebi isso, mas a minha questão agora é... porque é que (no caso do meu programa) preciso de o usar!

pela minha logica o metodo "private void ActualizaGui(object produtor, EventArgs args)" seria executado na mesma thread dos controlos.

porque não é?

Cumps, Mauro.

Share this post


Link to post
Share on other sites
nelsonr

O metodo é chamado dentro da classegeradora.ciclo, que está a ser executada num thread novo.

Share this post


Link to post
Share on other sites
maurosmartins

Ok nelsonr percebi!

então outra questão, eu queria incluir a classe que gera os eventos numa dll que seria dps usada noutra aplicação, e queria uma forma facil de na aplicação que for criada consumir o evento e actualizar o GUI, esta é a unica forma de o fazer?

Cumprimentos, Mauro.

Share this post


Link to post
Share on other sites
nelsonr

Basicamente, se queres mexer em controlos tens de usar o invoke, porque não são thread-safe.

Share this post


Link to post
Share on other sites
maurosmartins

Ok,

bioshock, nelsonr, obrigado pelas vossa ajuda.

Cumprimentos, Mauro.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.