maurosmartins Posted July 23, 2013 at 07:44 PM Report #519692 Posted July 23, 2013 at 07:44 PM 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.
bioshock Posted July 23, 2013 at 07:47 PM Report #519693 Posted July 23, 2013 at 07:47 PM Vê se te ajuda http://stuffpinho.com/csharp-working-with-threads/
maurosmartins Posted July 23, 2013 at 07:57 PM Author Report #519695 Posted July 23, 2013 at 07:57 PM 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.
bioshock Posted July 23, 2013 at 08:22 PM Report #519697 Posted July 23, 2013 at 08:22 PM 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(); });
maurosmartins Posted July 23, 2013 at 08:29 PM Author Report #519698 Posted July 23, 2013 at 08:29 PM 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.
maurosmartins Posted July 23, 2013 at 09:38 PM Author Report #519707 Posted July 23, 2013 at 09:38 PM 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.
nelsonr Posted July 23, 2013 at 09:53 PM Report #519708 Posted July 23, 2013 at 09:53 PM 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.
maurosmartins Posted July 23, 2013 at 09:56 PM Author Report #519710 Posted July 23, 2013 at 09:56 PM 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.
nelsonr Posted July 23, 2013 at 10:08 PM Report #519711 Posted July 23, 2013 at 10:08 PM O metodo é chamado dentro da classegeradora.ciclo, que está a ser executada num thread novo.
maurosmartins Posted July 23, 2013 at 10:15 PM Author Report #519713 Posted July 23, 2013 at 10:15 PM 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.
nelsonr Posted July 23, 2013 at 10:21 PM Report #519714 Posted July 23, 2013 at 10:21 PM Basicamente, se queres mexer em controlos tens de usar o invoke, porque não são thread-safe.
maurosmartins Posted July 23, 2013 at 10:24 PM Author Report #519715 Posted July 23, 2013 at 10:24 PM Ok, bioshock, nelsonr, obrigado pelas vossa ajuda. Cumprimentos, Mauro.
brunobola Posted September 9, 2013 at 11:45 PM Report #523951 Posted September 9, 2013 at 11:45 PM Podes sempre usar em vez de threads mackground process workers que são muito melhores e thread safe e muito mais fácil de gerir a interação com o UI, vê como usar em: http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now