Laden...

Form Funktion die im Thread gestartet wurde, arbeitet anscheinend nicht im Thread

Erstellt von Drake vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.180 Views
D
Drake Themenstarter:in
10 Beiträge seit 2019
vor 4 Jahren
Form Funktion die im Thread gestartet wurde, arbeitet anscheinend nicht im Thread

        // Inhalt der Form Klasse     
        public delegate void UpdateLoadingImage(Boolean state);   
     
        public void setLoadingVisible(Boolean state)
        {
            this.loadingImage.Visible = state;
            if (state){
                moving = true;
                moveLoadingImage();
            }
            else {
                moving = false;
            }
        }

        public void startLoadingScreen(Boolean state){
            UpdateLoadingImage UpdateLoadingImage = new UpdateLoadingImage(setLoadingVisible);
            this.loadingImage.BeginInvoke(UpdateLoadingImage, state);
        }



        public void moveLoadingImage()
        {
            Boolean reversed = false;
            do
            {
                if(this.loadingImage.Width > 25 && reversed == false) {
                    this.loadingImage.Width -= 1;
                    this.loadingImage.Height -= 1;
                    this.loadingImage.Location = new Point(this.loadingImage.Location.X + 1, this.loadingImage.Location.Y + 1);

                    if (this.loadingImage.Width == 25){
                        reversed = true;
                    }
                }else if (reversed){
                    this.loadingImage.Width += 1;
                    this.loadingImage.Height += 1;
                    this.loadingImage.Location = new Point(this.loadingImage.Location.X - 1, this.loadingImage.Location.Y - 1);

                    if (this.loadingImage.Height == 65) {
                        reversed = false;
                    }
                }
                this.Refresh();
                Thread.Sleep(50);
            } while (moving);
                this.loadingImage.Width = 65;
                this.loadingImage.Height = 65;
        }

// Die Client class aus der der Thread erstellt wird:
        // startLoadingBar wird in einer Internen Funktion der CLient Klasse ausgeführt
        private void startLoadingBar()
        {
            loadingThread = new Thread(() => form.startLoadingScreen(true));
            loadingThread.Start();


            form.Show();
        }

Guten Morgen,
also in der Client Klasse wird ein Thread gestartet der die Funktion im Form ausführt die für ein Ladebild sorgt. Alles funktioniert, also das Ladebild und die Vergrößerung-/Verkleinerung. Allerdings wenn die Funktion gestartet wird lässt sich im Windows Form nichts anderes mehr anklicken, obwohl die Funktion im Thread gestartet wurde. Wo liegt hier der Fehler?

Fehlermeldungen: Keine, da es sich wohl um einen logischen Fehler handelt.

4.931 Beiträge seit 2008
vor 4 Jahren

Hallo und willkommen,

du darfst nur im UI-Thread auf UI-Elemente zugreifen. Das hast du zwar durch das BeginInvoke erreicht, welches die Methode dann im UI-Thread ausführt, aber durch die Schleife blockierst du jedliche Interaktion, s.a. [FAQ] Warum blockiert mein GUI?

Wenn du ein animiertes Ladebild anzeigen möchtest, dann entweder den WinForms-Timer benutzen oder aber noch besser einen separaten Splashscreen, s. z.B.
SplashScreen-Komponente (noch eine ;-P)
Yet another SplashScreenHelper

C
2.121 Beiträge seit 2010
vor 4 Jahren

Zum Verständnis, was da passiert.

  1. es wird ein neuer Thread gestartet.
  2. Dieser Thread lagert dann alles weitere sofort wieder in einen anderen Thread um.
    Also kannst du diesen Thread auch auslassen.

Die Lösung für deinen Fehler ist das noch nicht (siehe Beitrag von Th69), war nur gedacht um zu erklären was du da noch für einen Denkfehler drin hast.

16.806 Beiträge seit 2008
vor 4 Jahren

Und nen kleiner Tipp: Du scheinst offenbar von Java zu kommen.
Programmier daher nicht unbedingt in C# so, wie man es in Java machen würde - sondern schreib C# nach den C# Best Practises 😉
[Artikel] C#: Richtlinien für die Namensvergabe

D
Drake Themenstarter:in
10 Beiträge seit 2019
vor 4 Jahren

Vielen Dank für eure Antworten. Da habe ich wohl mit den Threads etwas auf dem Schlauch gestanden. Jetzt funktioniert es aber über einen Timer, werde mir aber, sobald das Projekt fertig ist, die andere Methode anschauen, da ich mich jetzt erstmal nicht all zu lang mit dem Ladescreen aufhalten möchte.

Du scheinst offenbar von Java zu kommen.

Exactly 😁

Ich werde mir den Link mal zu Gemüte führen 😉