Announcement

Collapse
No announcement yet.

Thread blockiert GUI

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Thread blockiert GUI

    Hallo,
    ich habe eine SplashForm erstellt, die ich vor einem Datenbanklogin anzeigen will. Diese Form hat ein animiertes GIF. Wenn ich die DB-Anmeldung in einem eigenen Thread aus dem GUI-Prozess heraus starte, dann erfolgt leider keine Aktualisierung/Animation der SplashForm.

    Code:
    EFWait waitForm = new EFWait("Login...");
    waitForm.Show();
    Application.DoEvents();
    
    Thread t = new Thread(new ThreadStart(TestConnection));
    t.Start();
    t.Join();
    
    waitForm.Close();
    Die eigentliche Worker-Methode, die der neue Thread synchron abarbeiten soll:
    Code:
    void TestConnection()
    {
    	_connectionTestOk = databaseProvider.TestConnection(connectionString);
    }
    An sich ist die Anforderung einfach formuliert:
    1. SplashForm anzeigen (damit der Anwender weiß, was gerade passiert...)
    2. DB connecten (hier wird die herstellerspezifische ADO.NET-Methode Open() auf einem Connection-Objekt aufgerufen)
    3. Der Ursprungsthread wartet (via Join), bis der neue Thread fertig ist und schließt dann die SplashForm.


    Irgendetwas mache ich falsch. Hat jemand eine Idee?

    Gruß,
    Gunter

  • #2
    Irgendetwas mache ich falsch. Hat jemand eine Idee?
    Ja, Dein UI Thread wartet mit allem, auch mit Nachzeichnen, bis der Thread, der die Verbindung herstellt fertig ist.

    Es hat sich nichts am Verhalten geändert, im Vergleich zu ohne zusätzlichen Thread.

    Du musst dafür sorgen, dass der UI Thread weiterläuft und der Verbindungsthread sich meldet, wenn er fertig ist.

    Grüsse
    Simon

    Comment


    • #3
      Hallo,

      es wird einfacher, wenn das Splash-Formular von einem separaten Thread erzeugt und angezeigt wird. In diesem Fall läuft die Animation im Splash-Formular auch dann, wenn der primäre Thread der Benutzeroberfläche auf die Datenbankverbindung wartet.

      Comment


      • #4
        Ja, Dein UI Thread wartet mit allem, auch mit Nachzeichnen, bis der Thread, der die Verbindung herstellt fertig ist.
        Dann ist mir anscheinend der tiefere Sinn von Threads für so "einfache" Sachen noch immer nicht bewusst geworden. Wenn der aufrufende Thread eh blockiert wird...: rolleyes:

        Ich könnte es natürlich asynchron programmieren oder einen BackgroundWorker benutzen. Aber dann müsste ich ja irgendwie pollen, ob die Workermethode bzw. der BackgroundWorker fertig ist.

        es wird einfacher, wenn das Splash-Formular von einem separaten Thread erzeugt und angezeigt wird.
        Wenn ich es so mache wird die WaitForm im Moment bei mir überhaupt nicht dargestellt:

        Aufrufender Thread (Main):
        Code:
        Thread formThread = new Thread(new ThreadStart(ShowSplash));
        formThread.Start();
        
        TestConnection();
        
        //formThread.Join();
        formThread.Abort();
        Code:
        void TestConnection()
        {
        	_connectionTestOk = databaseProvider.TestConnection(connectionString);
        }
        
        void ShowSplash()
        {
        	EFWait waitForm = new EFWait("Login...");
        	waitForm.Show();
        	//Application.DoEvents();
        }
        Auch mit einem DoEvents() rüht sich nichts.

        Gruß,
        Gunter

        Comment


        • #5
          Hallo,

          Ich habe ein Beispiel gemacht.

          Edit:
          Jetzt verstehe ich erst was A. Kosch gemeint hat. :-)) Besser spät als nie.
          Mein Ansatz war umgekehrt: Die Lange dauernde Oprtation auf einen sep. Thread auslagern.

          Gruss Simon
          Attached Files

          Comment

          Working...
          X