Cross-thread operation not valid: Control 'RichTextBox1' accessed from a thread other than the thread it was created on.   zodpovězená otázka

VB.NET, Threading, WinForms

Dobrý den. Dělám si takový komunikátor přes sériový port a vše funguje ale když mám ve formu ve kterém mám komponentu SerialPort1 proceduru SerialPort1_DataRecieved ve které volám metodu pridej v komunikačním formuláři, tak app spadne a na řádku

RichTextBox1.Text &= Environment.NewLine & text

se mi ukáže výše uvedená chyba (nadpis). Poradí mi někdo jak to mám udělat? Díky předem, PC22.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To znamená, že richTextBox1 byl vytvořen v jiném vlákně, než z jakého se k němu pokoušíte přistupovat (typicky když je RichtextBox umístěn na formuláři, Vy spustíte něco v jiném vlákně a z toho jiného vlákna zkusíte přistupovat k tomu richtextboxu)

K prvkům formuláře můžete přistupovat jen z hlavního vlákna, pokud potřebujete na něm něco měnit z jiného vlákna, můžete použít např. komponentu BackGroundWorker (na tomto webu je o ní pěkný článek).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

o komponente BackGroundWorker som tu niako nenasiel clanok mozete mi prosim napisat LINK ? Dakujem

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý den,

dá se to také obejít tak, že ve formu definujete proměnou, do které budete předávat data ze seriového portu a následně data z proměné "sypat" do RichTextBoxu , třeba každých 100ms timerem

J.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

je to moznost ,ktora mi uz napadlo velmi davno a vysledok bol ze zbytocne sa zatazuje aplikacia... ved sami skuste ze je to hlupe.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To je právě velmi blbé řešení, ze dvou vláken se na jednu proměnnou nesahá!

Celý problém se řeší buď přes invoke, anebo přes SynchronizationContext.

Příklad přes Invoke (metoda musí být ve formuláři):

Delegate Sub SetRichTextBoxDelegate()

Protected Sub SetRichTextBox()
    If Me.InvokeRequired Then
        'jsme v jiném vlákně
        Me.Invoke(new SetRichTextBoxDelegate(SetRichTextBox))
        Exit Sub
    End If

    'nastavit RichTextBox
    RichTextBox1.Text = "Zdarec"
End Sub

Píšu z hlavy, snad je to správně.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

... skromný dotaz, jak by to vypadalo, když bych chtěl naplnit RichTextBox1 přijatými daty ze sériového portu, jsou v invoke nějaké parametry ?

J.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano to by mě také zajímalo. Pokud bych v proceduře SetRichTextBox potřeboval parametr Sub SetRichTextBox (ByVal text as String) Jak ho tam vmáčknu? Visual Studio na mě totiž řve, že delegát vyžaduje AddressOf a když ho tam dám tak mě to tam už nenechá parametr vtěstnat.

Můj kód tedy vypadá takto:

    Delegate Sub ZapsatTextDelegate()

    Protected Sub ZapsatText()
        If Me.InvokeRequired Then
            'jsme v jiném vlákně
            Me.Invoke(New ZapsatTextDelegate(AddressOf zapsatText))
            Exit Sub
        End If

        Me.Label1.Text = "AHOJ"
    End Sub

Ale já bych proceduře ZapsatText potřeboval posílat parametr.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Takže zpět, vyřešeno (sice náhodou ale vyřešeno) :)

Parametry se mi podařilo poslat takto:

    Delegate Sub ZapsatTextDelegate(ByVal text As String)

    Protected Sub zapsatText(ByVal text As String)
        If Me.InvokeRequired Then
            'jsme v jiném vlákně
            Me.Invoke(New ZapsatTextDelegate(AddressOf zapsatText), text)
            Exit Sub
        End If

        Me.Label1.Text = text
    End Sub

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky za vše ale již jsem našel řešení pomocí delegáta.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback