Laden...

Thread.Sleep verhindert das Ausführen eines vorherigen Befehls

11 Antworten
3,787 Aufrufe
Letzter Beitrag: vor 16 Jahren
Thread.Sleep verhindert das Ausführen eines vorherigen Befehls

Hallo
ich bin Grad dabei, ein Loginformular zu Programmieren
Wenn kein Benutzername eingegeben wurde soll das Benutzername-Feld einen schwarzen Hintergrund bekommen und unbeschreibbar sein
Nach 2 Sekunden sollen diese Eigenschaften wieder aufgehoben werde.
Nun werden nur die Befehle nach

Thread.Sleep(2000);

Anbei mein Code ...

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using System.Data.Odbc;
using MySql.Data.MySqlClient;

namespace Erstes_Programm_mit_GUI
{
    public partial class Login : Form
    {
        public Login()
        {
            InitializeComponent();
        }
        private void button_abbrechen_Click(object sender, EventArgs e)
        {
            close();
        }
        public void close()
        {
            this.Close();
        }
        void Button_einloggenClick(object sender, EventArgs e)
        {
            string mysql_daten =    "UID=;" +
                                    "PASSWORD=;" +
                                    "SERVER=;" +
                                    "DATABASE=;";
            MySqlConnection connection = new MySqlConnection(mysql_daten);
            connection.Open();
            if (connection == null)
            {
                MessageBox.Show("Unable to connect to database server!");
            }
            else if (connection != null)
            {
                MessageBox.Show("Connection to database server was successfull!");
                MySqlCommand checkifusernameisindb = new MySqlCommand("SELECT ID FROM benutzer WHERE benutzerName = '';", connection);
                if (string.IsNullOrEmpty(benutzername.Text))
                {
                    benutzername.BackColor = System.Drawing.Color.Black;
                    benutzername.Enabled = false;
                    Thread.Sleep(2000);
                    benutzername.Enabled = true;
                    benutzername.BackColor = System.Drawing.Color.Wheat;
                    benutzername.Text = "test";

                }

              
            }


            

            
        }
    }
}

Thread.Sleep verhindert das Ausführen eines vorherigen Befehls

Ist als Aussage vollkommen richtig und ist genau dafür da.

Schau Dir Timer an und überdenke Deinen Post noch mal, da taucht nicht mal eine Frage oder ähnliches auf.

Vielleicht löst du das besser mit einem Timer.
Ich glaube das Thread.Sleep() legt die ganze Oberfläche inklusive OnPaint() und den ganzen kram schlafen, so dass da gar nichts neu gezeichnet wird.

OT: herbivore hat glaub ich irgendwo mal geschrieben, dass man statt


if (connection == null)

else if (connection != null)

eher


if (connection)

else if (!connection)

machen sollte, weil das sonst doppelt gemoppelt ist und somit sinnlos.

Gruß, Alf

Hallo Soulkiller1990,
dien Tipp von Knuddlbaer solltest du dir mal anschauen..

Aber zu deinem Problem:

Thread.Sleep(xxx) verhindert u.a. das Windows-Nachrichten richtig ausgewertet werden. Es gibt die große Keule

Application.DoEvents()

die zwingend alle vorhandenen Windows-Nachrichten weiterleitet / auswertet. Aber das sollte man vermeiden.

-> Daher lieber einen Timer einsetzen..

Viele Grüße,
moq

Hm die Fragestellung fehlt in der Tat
Also jetzt hab ich 2 Fragen :
1)Warum wird der Befehl vor dem Sleep nicht ausgeführt (von der Reihenfolge her müsster das ja erst machen und dann den Thread schlafen legen
2)Wie funktioniert das mit dem Timer? Gibs da irgendwo n Tutorial?

Beides findest Du entweder in der MSDN oder im Grundlagenbuch.

Thread.Sleep(xxx) verhindert u.a. das Windows-Nachrichten richtig ausgewertet werden. Es gibt die große Keule

Application.DoEvents()  

die zwingend alle vorhandenen Windows-Nachrichten weiterleitet / auswertet. Aber das sollte man vermeiden.

Bei einem Thread.Sleep im UI Thread wird Dir auch ein Application.DoEvents nicht helfen. Der Thread seht AFAIK mindestens so lange wie in Thread.Sleep angegeben. Er bekommt einfach keine Zeit zugewiesen etwas zu machen.

  
if (connection == null)  
  
else if (connection != null)  
  

eher

if (connection)  
  
else if (!connection)  

Wo ist da jetzt der Unterschied ?

Vor dem Sleep und nach dem Sleep hilfts schon. 😉

Hallo zusammen,

generell siehe auch [FAQ] Warum blockiert mein GUI?

OT: herbivore hat glaub ich irgendwo mal geschrieben, dass man[...]

Nein, das war in einem anderen Zusammenhang: [Tipp] Anfängerfehler == true / == false

Trotzdem ist der Vergleich auf null sinnlos, da connection nie null sein wird.

Schlägt die Verbindung fehl, sollte eine Exception auftreten.

Ebenfalls redunant wäre die Verwendung von else if, aber das ist zu vernachlässigen.

Nochmal, Thread.Sleep ist keine vernünftige Implementierung. Statt Thread.Sleep immer einen Timer verwenden. Für Gui empfielt beispielsweise System.Windows.Forms.Timer, für Business-Logik ein System.Threading.Timer.

2)Wie funktioniert das mit dem Timer? Gibs da irgendwo n Tutorial?

beispiele gibts meist auf der MSDN-Seite der jeweiligen Klasse.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

Hallo Alf Ator,

OT: herbivore hat glaub ich irgendwo mal geschrieben, dass man statt

if (connection == null)  
  
else if (connection != null)  
  

eher

if (connection)  
  
else if (!connection)  

machen sollte, weil das sonst doppelt gemoppelt ist und somit sinnlos.

das habe ich bestimmt noch nicht geschrieben 😃 Wenn wir mal voraussetzen, dass connection null sein könnte (was ja im Beispiel nicht der Fall ist), dann würde man einfach

if (connection == null) {
   ...
} else {
   ...
}

oder

if (connection == null) {
   ...
   return;
} 
...

schreiben. Eine doppelte Abfrage wäre in der Tat doppelt gemoppelt.

herbivore

... zudem würde der C# Compiler das Konstrukt gar nicht akzeptieren, da Connection nicht vom Typ bool ist.