Chat auf mySQL Basis



  • Hallo!

    Da mein Spiel inzwischen so funktioniert, wie ich mir das vorgestellt habe, wollte ich an etwas neues setzen: einen Chat. Da das Ganze online funktionieren sollte, dachte ich, ich bediene mich meiner mySQL-Datenbank (da ich mich mit MSSQL, etc. noch beschäftigen muss - bzw. vor allem wie ich das ganze dann online kriege).

    Prinzipiell war bis jetzt alles kein Problem; die Anbindung an die Datenbank erfolgte relativ problemlos, es ist alles so ziemlich selbsterklärend und die Konsolen-Version des Chats hat relativ schnell einwandfrei funktioniert. Da das aber bisschen doof aussah, wollte ich das ganze in einer Win-Form realisieren. Alles auch kein Problem; die Indikatoren für die Verbindung, das Senden der Nachrichten - funktioniert alles. Bin ja fast schon stolz ;>...

    Mein größtes Problem im Moment aber:
    Die Output-Box. Ich habe für den Output eine RichTextBox verwendet. Das Programm soll nun in einem 5-sekunden-Intervall die Datenbank nach Inhalten abfragen; lösen will ich mein Problem im Endeffekt so, dass ich mir die angezeigten Nachrichten speichere, und lediglich noch bei Änderung (sprich nur noch die Daten zählen lasse) die Daten aus der Datenbank ziehe - für den Moment aber tut es ein billiges "Box leeren, Inhalt neu reinschreiben". Mein Problem aber ist folgendes:

    Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement txtContent erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.

    Mein Formular erstellt bei der "Geburt" (mir fällt das richtige Wort gerade nicht ein, hmpf) einen Timer mit 5 Sekunden Intervall:

    System.Timers.Timer t = new System.Timers.Timer();
                    t.Interval = 2000;
                    t.Elapsed += new ElapsedEventHandler(Refresh);
                    t.Start();
    

    Die Refresh-Funktion:

    public void Refresh(object sender, ElapsedEventArgs e)
            {
                txtContent.Text = "nein";
            }
    

    (Testinhalt)

    Und eben hier scheint der Wurm drin zu sein; ich darf von der Refresh-Funktion aus nicht auf die Content-RTB zugreifen. Evtl. habe ich mir einfach zu viel vorgenommen, aber ich mag es einfach, auf diese Art und Weise eine Programmiersprache zu lernen - sich an Probleme wagen, die größer sind, als man selbst. 🙂



  • Verwendest du WinForms oder WPF? Bei beiden gibt es dazu eigene Timer: System.Windows.Forms.Timer bzw. System.Windows.Threading.DispatcherTimer

    Diese laufen im gleichen Thread wie die GUI (d.h. im MainThread).

    Ansonsten schau dir diesen FAQ-Artikel zu deiner Fehlermeldung an: Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke).



  • Ah, wunderbar, funktioniert. Danke 🙂

    Wäre es aber auch möglich den Inhalt der RTB und die entsprechende Refresh-Methode in einen eigenen Thread auszulagern? Im Moment ruckelt das GUI alle 2 Sekunden ganz kurz, eben wenn der Refresh durchgeführt wird, was vermutlich daran liegt, dass eigentlich alles im gleichen Thread läuft.



  • System.Timers.Timer läuft in einem anderen Thread als die GUI. Genau deshalb hattest Du ja das Problem mit dem "ungültigen threadübergreifenden Vorgang". Mit Invoke kannst Du von einem anderen Thread eine Aktion im GUI-Thread durchführen, sprich, Controls aktualisieren. (Der System.Windows.Forms.Timers läuft übrigens direkt im GUI-Thread).

    Auf Controls kann nicht von einem anderen Thread aus zugegriffen werden also "Nein" zu Deiner letzten Frage. (Ausnahme: Invoke und wenige weitere Methoden)

    Du könntest die eigentliche Datenbankabfrage in einen Thread auslagern (oder sie im System.Timers.Timer Tick-Handler durchführen, ist ja auch ein nicht-GUI-Thread) und NUR die Aktualisierung des Controls mittels Invoke im GUI-Thread durchführen. Denn: Das kurze Ruckeln dürfte seine Ursache in der Datenbankabfrage haben.

    Dein Chat ist übrigens sehr exotisch. Also eine Datenbank zu pollen würde ich als ungewöhnliche Vorgehensweise bezeichnen. Vielleicht interessiert Dich das Thema Sockets oder .NET-Remoting womit Chats für gewöhnlich realisiert werden.


Anmelden zum Antworten