Hi Leute 😄
Ein Klassenkamerad und ich schreiben gerade an einem Chat-Programm. Es funktioniert so weit auch ganz gut, aber mir fiel schon am Anfang auf, wie sehr es beim Aktualisieren ruckelt. Man kommt in das Fenster mit dem Chat, es wird aktualisiert (Online-Liste und MessageBox) und man kann erstmal nichts machen. Wenn es dann damit fertig ist macht es das alle 3 Sekunden (Timer) und man kann kaum vernünftig schreiben. Hat jemand eine Idee, wie man dieses Ruckeln weg bekommt?
private void ReceiveTimer_Tick(object sender, EventArgs e)
{
try
{
string[] log_array;
int anz,aw,i;
ReceiveTextbox.Clear();
HttpWebRequest httpWReq = (HttpWebRequest)WebRequest.Create(@"http://www.pwnedfruitcake.bplaced.net/Logreader.php");
ASCIIEncoding encoding = new ASCIIEncoding();
string postData = "&bname=" + Program.bname + "&bpass=" + Program.bpass;
byte[] data = encoding.GetBytes(postData);
httpWReq.Method = "POST";
httpWReq.ContentType = "application/x-www-form-urlencoded";
httpWReq.ContentLength = data.Length;
using (Stream stream = httpWReq.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
HttpWebResponse response = (HttpWebResponse)httpWReq.GetResponse();
string log = new StreamReader(response.GetResponseStream()).ReadToEnd();
httpWReq.Abort();
log_array = log.Split('\n');
anz = log_array.GetUpperBound(0)+1;
if (anz > 10)
{
aw = anz - 10;
}
else
{
aw = 0;
}
log = "";
for (i = aw; i < anz; i++)
{
log = log + log_array[i] + "\r\n";
if (Program.familyfriendly == true)
{
log = log.Replace("ass", "***");
log = log.Replace("Ass", "***");
log = log.Replace("asshole", "*******");
log = log.Replace("Asshole", "*******");
log = log.Replace("fuck", "****");
log = log.Replace("Fuck", "****");
log = log.Replace("shit", "****");
log = log.Replace("Shit", "****");
log = log.Replace("arsch", "*****");
log = log.Replace("Arsch", "*****");
log = log.Replace("arschloch", "*********");
log = log.Replace("Arschloch", "*********"); //JA, das ist unser Schimpfwortfilter, bzw der Ansatz^^
}
}
ReceiveTextbox.Text = log;
}
catch (WebException we)
{
}
}
private void Online_Timer_Tick(object sender, EventArgs e)
{
try
{
string[] log_array, user_array;
int i;
Online_Liste.Clear();
HttpWebRequest httpWReq = (HttpWebRequest)WebRequest.Create(@"http://www.pwnedfruitcake.bplaced.net/OnlineListe.php");
ASCIIEncoding encoding = new ASCIIEncoding();
string postData = "&bname=" + Program.bname + "&bpass=" + Program.bpass;
byte[] data = encoding.GetBytes(postData);
httpWReq.Method = "POST";
httpWReq.ContentType = "application/x-www-form-urlencoded";
httpWReq.ContentLength = data.Length;
using (Stream stream = httpWReq.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
HttpWebResponse response = (HttpWebResponse)httpWReq.GetResponse();
string log = new StreamReader(response.GetResponseStream()).ReadToEnd();
httpWReq.Abort();
log_array = log.Split('\n');
for(i = 0; i <= log_array.GetUpperBound(0)-1; i++)
{
user_array = log_array[i].Split(':');
if (user_array[1] == "1\r")
{
Online_Liste.ForeColor = Color.ForestGreen;
Online_Liste.Text += "• " + user_array[0] + "\r\n";
}
}
}
catch (WebException we)
{
}
}
Vielen Dank im Voraus!
lg mko
a) Konzept überdenken
a,1) Threading verwenden
a,2) Nur wirklich die GUI aktualisieren, wenn neue Daten vorhanden.
a,3) Vielleicht könntest du die Nachrichten als JSON oder XML übertragen.
a,3) Online_Liste.ForeColor = Color.ForestGreen in einer for-Schleife ist unglücklich; Einmal vorher reicht.
b) Schimpfwortfilter: Regex.Replace mit Option IgnoreCase verwenden. Das Word fUCk würde bei dir nicht gefiltert werden.
b,2) Natürlich in eine Methode auslagern.
b,3) Besser: Schimpfwortfilter Serverseitig einbinden
Weiter: [Hinweis] Wie poste ich richtig? und [FAQ] Warum blockiert mein GUI?