Avatar billede oo Nybegynder
06. marts 2006 - 09:07 Der er 6 kommentarer og
1 løsning

Threading problem

Jeg har en proces der skal opdatere min GUI, men får denne exception:

Cross-thread operation not valid: Control 'textBox1' accessed from a thread other than the thread it was created on.

Proces.cs >>

//declaring the event handler delegate
    public delegate void ValueChangedEventHandler(object source, double Value);

    public class Process
    {
        bool isAlive = true;

        public Process()
        {
            Thread thread = new Thread(new ThreadStart(Run));

            thread.Start();
        }

        //declaring the event
        public event ValueChangedEventHandler ValueChanged;

        public void Run()
        {
            Vaegt_Fase fase = new Vaegt_Fase();

            while (isAlive)
            {
                Vaegt_Fase.VaegtFase_Vaerdier current_Fase = fase.Run(15,10);

                if (current_Fase.State == FaseState.Approved)
                    ValueChanged(this, current_Fase.Value);
                /*if (current_Fase.State == FaseState.NotApproved)
                    ValueChanged(this, current_Fase.Value);*/
                if (current_Fase.State == FaseState.Working)
                    ValueChanged(this, current_Fase.Value);

                Thread.Sleep(1000);
            }           
        }
    }

Form1.cs >>

public partial class Form1 : Form
    {
        Entity.Process proces;

        public Form1()
        {
            InitializeComponent();
            proces = new Entity.Process();
            proces.ValueChanged += new Entity.ValueChangedEventHandler(proces_ValueChanged);
        }

        void proces_ValueChanged(object source, double Value)
        {
            textBox1.Text = Value.ToString(); // Exception kommer her.
            //MessageBox.Show(Value.ToString());
        }
    }
Avatar billede iblarsen Praktikant
06. marts 2006 - 09:12 #1
Prøv at kigge på BackgroundWorker. Prøv at kigge http://www.idesign.net/idesign/DesktopDefault.aspx?tabindex=5&tabid=11 og kig på punktet "BackgroundWorker Demo"
Avatar billede oo Nybegynder
06. marts 2006 - 11:12 #2
Hvordan ville det se ud...?

Jeg har nu læst og forsøgt, men uden held...det jeg leder efter er en metode til at påvirke min textbox på...
Avatar billede Spotgun Seniormester
06. marts 2006 - 11:46 #3
Prøv følgende (i Form1.cs)

private delegate void updateTextBoxHandler(string text);

private void updateTextBox(string text) {
  if(textBox1.InvokeRequired)
  {
    textBox1.Invoke(new updateTextBoxHandler(updateTextBox), new object[] { text });
  }
  else
  {
    textBox1.Text = text;
  }
}

i din proces_ValueChanged metode, så brug:
  updateTextBox(Value.ToString());
i stedet for at sætte textbox-teksten direkte.
Avatar billede Spotgun Seniormester
06. marts 2006 - 11:48 #4
Det skal lige siges at jeg har skrevet det ud fra hukommelsen, så slåfejl og kompileringsfejl er gratis :)
Avatar billede iblarsen Praktikant
06. marts 2006 - 11:52 #5
Prøv at kigge på "Safecontrols" også på www.idesign.net
Avatar billede oo Nybegynder
06. marts 2006 - 16:46 #6
Tak...

iblarsen..tak for linket, der står meget godt på de sider...bare ikke det jeg skulle bruge.

Spotgun det var dit svar jeg ledte efter...mangler dog et svar for at uddele points.

Jeg løste i mellemtiden problemet ved at gemme parametren Value i en global variabel text og derefter kalde Form.Invalidate().

private void Form1_Paint(object sender, PaintEventArgs e)
        {
            textBox1.Text = text;
        }
Avatar billede Spotgun Seniormester
06. marts 2006 - 17:09 #7
Og her var så et svar :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester