von Thread auf Mainform zugreifen

hagbard_celine

Mitglied
Ich habe folgendes Problem:

Ich habe ein Form mit 2 Elementen, einer Textbox und einer Funktion.

Die Funktion:
Code:
        public void doLog(string LogText)
        {
            MessageBox.Show(LogText);
            this.textBox1.AppendText("[" + DateTime.Now.ToString() + "] - " + LogText + Environment.NewLine);
        }

nun Starte ich vom Form aus einem Thread, von dem aus will ich die Funktion doLog ausführen. Das mach ich bissher so:

Start des Threads:
Code:
            StatusServer = new StatusServer(this);
            Thread StatusServerThread = new Thread(new ThreadStart(StatusServer.StartServer));
            StatusServerThread.Start();

Abspeichern der Referenz:
Code:
        public StatusServer(ServerControl ServerControl)
        {
            this.ServerControl = ServerControl;
        }

        private ServerControl ServerControl;

Aufruf der Funktion:
Code:
this.ServerControl.doLog("test");

Der Aufruf der Funktion funktioniert, aber der übergebene Text wird nicht in die Textbox geschrieben, der Messagebox Aufruf funktioniert.

Woran kann das liegen, gibt es eine andere / bessere Art das ganze zu machen?
 
Das funktioniert nicht, weil du immer noch im gleichen Thread bist. Benutze den Invoke()-Delegate deiner TextBox. Näheres dazu vor ein paar Posts bzw. auf dem MSDN.
 
Vieleicht bin ich ja einfach nur zu **** aber ich habe mir in der MSDN und im Form so zimmlich alles durch gelesen was ich zu Invoke und Delegate gefunden habe!

Aber ich werde daraus nicht schlau, kann mir vieleicht jemand mal nen praktisches Beispiel machen?

Ich habe im Moment folgendes:
MainForm:
Code:
class MainForm : Form
{
  public MainForm()
  {
    ...
    StatusServer = new StatusServer(this);
    Thread StatusServerThread = new Thread(new ThreadStart(StatusServer.StartServer));
    StatusServerThread.Start();
  }

  private Textbox LogBox;

  public void doLog(string LogText)
  {
    this.LogBox += LogText;
  }
}

und die im Thread auszufürende Klasse:
Code:
        public void StartServer()
        {
            doStopServer = false;
            TcpListener.Start();

            while (!doStopServer)
            {
                try
                {
                    TcpClient client = TcpListener.AcceptTcpClient();
                    Thread StatusSender = new Thread(new ParameterizedThreadStart((new SendStatus()).SendStatusToClient));
                    StatusSender.Start(client);
                    //Hier will ich auf die Funktion doLog zugreifen
                }
                catch { }
            }
        }

Wie bekomme ich das hin?
 
Weil anscheinend alle Zeichenprozesse eines Controls dessen Parent und dessen Childs
synchron nacheinander ablaufen müssen...
Wenn nun ein anderer Thread direkt auf das Control zugreift,
kommt das ganze durcheinander und es entstehen Deathlocks. :eek:
Hier habt ihr ein nettes OOP grechtes WorkerThread Beispiel: [post=1337449]AW: Probleme beim neuzeichnen von pictureBox - Post[/post]
 
Zurück