Entwickler-Ecke

WinForms - Aus Thread heraus in Steuerelement schreiben


CopWorker1 - Mi 25.11.20 11:24
Titel: Aus Thread heraus in Steuerelement schreiben
Hallo zusammen,

in meiner Windows Forms Klasse

C#-Quelltext
1:
public partial class TestComMainDlg : Form                    

möchte ich eine Queue auslesen, was mir aber den übrigen Programmverlauf nicht beeinflussen soll.
Dazu habe ich in dieser Klasse einen Thread eingebaut.
Der sieht so aus:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
#region QueueThreading-----------------------

        private void InitQueueThreading()
        {
            _BThreadRunning = true;
            Thread QueueCycle = new Thread(ReadQueue);
            QueueCycle.Start();
        }

        private void DeinitQueueThreading()
        {
            _BThreadRunning = false;
        }

        private void ReadQueue()
        {
            int iCount = 0;

            while (_BThreadRunning)
            {
                //Meldungsstapel auslesen und als Hexdump konvertiert auf referenzierten String zurückgeben
                iCount = clTestCom.ReadMsgQueue(ref strConvertedString);

                if (iCount > 0)
                    SetFormatedText2Textbox();
            }
        }
#endregion

Dann verwende ich noch eine Funktion um eine aus der Queue ausgelesenen Eintrag zu Formatieren und
in einem bzw. 2 Ausgabefeldern "Textbox" "tbReceiveMsg.Text", tbReceiveMsgScroll.Text" auszugeben.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
private void SetFormatedText2Textbox()
        {
            string strRet = string.Empty;

            tbReceiveMsg.Text = string.Format(strMessageCounter, _iMessageCounter, strConvertedString);

            if (tbReceiveMsgScroll.Lines.Length > 0)
                strMessageOut = "\r\n" + string.Format(strMessageCounter, _iMessageCounter, strConvertedString);
            else
                strMessageOut = string.Format(strMessageCounter, _iMessageCounter, strConvertedString);

            tbReceiveMsgScroll.AppendText(strMessageOut);
            _iMessageCounter++;
        }


Beim Aufruf dieser Funktion "SetFormatedText2Textbox()" kommt die Fehlermeldung:
Zitat:
"Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement tbReceiveMsg erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde."

Wie muss ich den Thread gestalten dass ich in ein Dialogfeld schreiben kann?

Vielen Dank.
Grüße von CopWorker1

Moderiert von user profile iconTh69: Quote-Tags hinzugefügt


Th69 - Mi 25.11.20 12:38

Hallo,

lies mal [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke) [https://mycsharp.de/wbb2/thread.php?threadid=33113] aus einem anderen C#-Forum.

In modernerem .NET verwendet man aber eigentlich keine eigenen Threads mehr, sondern die Task [https://docs.microsoft.com/de-de/dotnet/api/system.threading.tasks.task]-Klasse (sowie asynchrone Programmierung). Ansonsten gibt es auch noch die BackgroundWorker [https://docs.microsoft.com/de-de/dotnet/api/system.componentmodel.backgroundworker]-Klasse.