Avatar billede microjet Nybegynder
10. juni 2008 - 16:04 Der er 6 kommentarer og
1 løsning

Cross-thread problem

Hejsa

Jeg har bixet med noget kode i mange dage... jeg er ny i C#.. har dog programeret Delphi i en del år, men jeg er kørt lidt fast og jeg ved heller ikke om det er den rigtige måde jeg har lavet det på. Det drejer sig om 3 DLL'er der skal arbejde sammen. En device.dll sender en kommando til Multiplexer.dll, som bestemmer hvilken port type der skal benyttes eks. COMport.dll

COMport.dll sender kommando til COMporten... så snart svaret kommer sendes det tilbage gennem alle DLL'er til applikationen.

Nogle komandoer kan godt forårsage at produktet der kommunikeres med sender data uafbrudt, som efterfølgende kontinuerligt skal sendes til applikationen!

Det jeg har lavet syntes at virke, men der opstår en cross-thread fejl når svarene kommer tilbage.

Jeg har fundet frem til at det er noget med bruge Invoke!... men jeg er lidt blank på det område, så jeg håber på lidt hjælp

Koden kan des i dette dokument, hvor jeg med røde tal har prøvet at beskrive data forløbet http://www.h2opower.dk/CrossThreadProblem.doc

M.v.h

Tue
Avatar billede Syska Mester
10. juni 2008 - 18:18 #1
http://www.eksperten.dk/spm/749858

Det hele sker fordi du fra en ny tråd prøver at skrive data til en klasse eget af en anden tråd ...

Læs overstående link, som burde forklare lidt af hvorfor det sker ... ved der er flere på eksperten ... da det rimelig tit kommer op :-)

// ouT
Avatar billede microjet Nybegynder
11. juni 2008 - 10:46 #2
Jeg har læst flere af de indlæg du henviser til, men jeg er lidt blank omkring hvor og hvordan jeg skal bruge invoke.. jeg har prøvet dette:

        public delegate void testdelegate(object sender,String Data);
        public void test(object sender, String data)
        {
            if (this.InvokeRequired)
                this.Invoke(new testdelegate(this.test), new object[] { data });

            else
            {
                richTextBox1.AppendText(data);
            }
        }


Men følgende fejlopstår: Uoverensstemmelse mellem parameterantal

Jeg har nok heller ikek helt klarhed over hvordan Invoke virker... så hvis nogen kunne vise det i dette eks. ville det være en stor hjælp.
Avatar billede Syska Mester
11. juni 2008 - 13:54 #3
private void button1_Click(object sender, EventArgs e)
{
    Thread t = new Thread(new ThreadStart(UpdateUI));

    t.Start();
}

private void UpdateUI()
{
    for (int i = 0; i < 10; i++)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new UpdateLabelDelegate(UpdateLabel), "From the thread " + i.ToString());
        }
        else
        {
            UpdateLabel("Not from the thread " + i.ToString());
        }

        Thread.Sleep(1000);
    }
}

delegate void UpdateLabelDelegate(string s);
private void UpdateLabel(string s)
{
    label1.Text = s;
}

Opret button og label i en windows form ... så kan du se at det er via invoke det bliver kaldt ... giver exception, med mindre man bruger det ...

// ouT
Avatar billede microjet Nybegynder
11. juni 2008 - 15:15 #4
Tak for hjælpen! Jeg har fået det til at virke... jeg føler dog ikke at jeg overhoved har styr på hvordan invoke helt konkret virker... men det kommer sikkert :-)
Avatar billede microjet Nybegynder
11. juni 2008 - 15:18 #5
Sådan her ser koden ud som virker:     

        delegate void testdelegate(String data);
        public void test(String data)
        {
            if (this.richTextBox1.InvokeRequired)
            {
                testdelegate d = new testdelegate(test);
                this.Invoke(d, new object[] { data });
            }
            else
            {
                this.richTextBox1.AppendText(data);
            }
        }
Avatar billede kodehoved Nybegynder
11. juni 2008 - 19:40 #6
Grunden til at du skal bruge InvokeRequired og derefter Invoke på en anden tråd er, at Windows kun tillader "GUI-tråden" at ændre tilstand på GUI-komponenter. Så konstruktionen svarer til, at du spørger om koden afvikler på GUI-tråden. Gør den ikke det, beder du derefter GUI-tråden afvikle din kode.

Jeg har lige skrevet en længere tekst om tråde og samtidighedsproblemer på http://kodehoved.dk som du måske kan få glæde af.

mvh
Brian
Avatar billede Syska Mester
11. juni 2008 - 21:07 #7
Hvis dette er enden på dit spm, så vil jeg smide et svar, hvis du har fået noget ud af det jeg har skrevet :-)

// ouT
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