Autor Beitrag
CopWorker1
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mi 25.11.20 11:24 
Hallo zusammen,

in meiner Windows Forms Klasse
ausblenden 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:
ausblenden 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 25.11.20 12:38 
Hallo,

lies mal [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke) aus einem anderen C#-Forum.

In modernerem .NET verwendet man aber eigentlich keine eigenen Threads mehr, sondern die Task-Klasse (sowie asynchrone Programmierung). Ansonsten gibt es auch noch die BackgroundWorker-Klasse.