Laden...

Aktualisierungs-Probleme: (Chat-)Fenster ruckelt/hängt bei jeder Datenermittlung/Aktualisierung

Erstellt von mko vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.087 Views
Thema geschlossen
M
mko Themenstarter:in
1 Beiträge seit 2013
vor 10 Jahren
Aktualisierungs-Probleme: (Chat-)Fenster ruckelt/hängt bei jeder Datenermittlung/Aktualisierung

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

76 Beiträge seit 2008
vor 10 Jahren

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?

Thema geschlossen