ICh habe einen Chat in C# programmiert. Alle Nachrichten speichere ich auf einer MySQL Datenbank. Nun möchte ich alle 100ms überprüfen ob sich der Text geändert hat. Habe auch schon einen passenden Code geschrieben, aber es gibt 2 Schwachpunkte:
1. Er schreibt den ganzen Text nocheinmal. Ich möchte nur, dass der neue Text hinzugefügt wird.
2. Es laggt extrem. Ein Buchstabe benötigt um die 500ms um getippt zu werden.
private void timer1_Tick(object sender, EventArgs e)
{
string b = "";
//textBox1.Text = ""; string connectionString = "Server=db4free.net;Uid=korkenzieher;Pwd=Parafreak; Database=dolbydisk;"; // Verbidnung herstellen
MySqlConnection connection = new MySqlConnection(connectionString); //Verbindung herstellen
connection.Open();
MySqlCommand command = new MySqlCommand("SELECT * FROM Chat", connection); //Liste Chat als zu lesende Liste wählen
MySqlDataReader Reader; //Initialisieren eines REaders
Reader = command.ExecuteReader();
while (Reader.Read()) //LEsen aus der Datenbank
{
string row = "";
for (int i = 0; i < Reader.FieldCount; i++)
{
b += Reader.GetValue(i).ToString() + "\n "; //Speichern in einen String
b += "\r\n";
}
b += "\n";
}
Reader.Close();
if (textBox1.Text.Equals(b)) //Wenn sich nichts geändert hat dann nichts machen
{
}
else//Fals doch einen Ton abspielen und ALLES refreshen
{
SoundPlayer sp = new SoundPlayer(Chat.Musik.Resource1.type);
sp.Play();
textBox1.Text = b;
}
textBox1.SelectionStart = textBox1.Text.Length; //Scrollbar nach unten setzen
textBox1.ScrollToCaret(); //Scrollbar nach unten setzen
}
private void timer1_Tick(object sender, EventArgs e)
{
string b = "";
//textBox1.Text = ""; string connectionString = "Server=db4free.net;Uid=korkenzieher;Pwd=Parafreak; Database=dolbydisk;"; // Verbidnung herstellen
MySqlConnection connection = new MySqlConnection(connectionString); //Verbindung herstellen
connection.Open();
MySqlCommand command = new MySqlCommand("SELECT * FROM Chat", connection); //Liste Chat als zu lesende Liste wählen
MySqlDataReader Reader; //Initialisieren eines REaders
Reader = command.ExecuteReader();
while (Reader.Read()) //LEsen aus der Datenbank
{
string row = "";
for (int i = 0; i < Reader.FieldCount; i++)
{
b += Reader.GetValue(i).ToString() + "\n "; //Speichern in einen String
b += "\r\n";
}
b += "\n";
}
Reader.Close();
if (textBox1.Text.Equals(b)) //Wenn sich nichts geändert hat dann nichts machen
{
}
else//Fals doch einen Ton abspielen und ALLES refreshen
{
SoundPlayer sp = new SoundPlayer(Chat.Musik.Resource1.type);
sp.Play();
textBox1.Text = b;
}
textBox1.SelectionStart = textBox1.Text.Length; //Scrollbar nach unten setzen
textBox1.ScrollToCaret(); //Scrollbar nach unten setzen
}
private void timer1_Tick(object sender, EventArgs e)
{
string b = "";
//textBox1.Text = ""; string connectionString = "Server=db4free.net;Uid=korkenzieher;Pwd=Parafreak; Database=dolbydisk;"; // Verbidnung herstellen
MySqlConnection connection = new MySqlConnection(connectionString); //Verbindung herstellen
connection.Open();
MySqlCommand command = new MySqlCommand("SELECT * FROM Chat", connection); //Liste Chat als zu lesende Liste wählen
MySqlDataReader Reader; //Initialisieren eines REaders
Reader = command.ExecuteReader();
while (Reader.Read()) //LEsen aus der Datenbank
{
string row = "";
for (int i = 0; i < Reader.FieldCount; i++)
{
b += Reader.GetValue(i).ToString() + "\n "; //Speichern in einen String
b += "\r\n";
}
b += "\n";
}
Reader.Close();
if (textBox1.Text.Equals(b)) //Wenn sich nichts geändert hat dann nichts machen
{
}
else//Fals doch einen Ton abspielen und ALLES refreshen
{
SoundPlayer sp = new SoundPlayer(Chat.Musik.Resource1.type);
sp.Play();
textBox1.Text = b;
}
textBox1.SelectionStart = textBox1.Text.Length; //Scrollbar nach unten setzen
textBox1.ScrollToCaret(); //Scrollbar nach unten setzen
}
Gibt es da nicht eine einfachere Methode? Ohne laggen?
z.B wie textChanged();
Connection Pooling sollte aber vom Anwendungsentwickler transparent passieren, er sollte da nichts weiter machen müssen. ALternativ kann er ja die Verbindung nmal offen lassen um zu prüfen ob das schneller geht.
@Korkenzieher: Achte darauf dass deine Chattabelle einen Primärschlüssel besitzt (so'n Autoincrement-Teil) und teste nur mit diesem Schlüsselwert ob Änderungen stattgefunden haben: speichere im Client den Primärschlüsselwert der letzten Tabellenzeile und prüfe bei einem Neukonnekt ob schon wieder eine neue Zeile eingetragen wurde indem du nur den Primkey-Wert der letzten Zeile ausliest und mit dem Wert in der App vergleichst. Lade nur im Änderungsfall den Chattext neu rein.
Ist Connection-Pool ein C# Befehl oder ein MYSQL Befehl? Und was bringt er mir?
Es läuft nun eindeutig schneller indem ich die Verbindung wirklich nur am Anfang aufbaue und dann öffen lasse.
Aber wie mache ich das, dass nur die NEUEN reingeschrieben werden?
@witte:
Ich verstehe was du meinst: Dass ich immer mit dem Text einen Zufallscode mitgebe und den immer überprüfe? Mein Problem dabei wäre aber: Wie komme ich genau in diese letzte Zeile wo der Code stehen sollte? Und wie schneide ich diesen Code dann wieder aus der TextBox aus?
Der Code muss noch sehr verbessert werden: Ich bin also für alle IDeen offen^^
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.