none
Splashscreen/-image RRS feed

  • Frage

  • Mahlzeit!

    Mich plagt mal wieder ein kleines Problemchen, bei dem ich nicht so recht weiterkomme.

    Ich habe in meinem Projekt 2 Hauptforms, für die der Splashscreen einen Status abfragen muss.

    Form1 überprüft kritische Ereignisse vor dem Start (zb ob bestimmte dlls vorhanden sind) und Form2 ist dann die Hauptebene.


    Nun habe ich aber folgendes Problem:

    Durch die Prüfroutinen am Anfang, verzögert sich der Start ein wenig.
    Während dieser Verzögerung möchte ich ein kleines "Fenster" (in dem Fall entweder eine dritte Form, oder die bereits bestehende Form1) aufploppen sehen, das mir mitteilt, dass das Programm bereits am laden ist.

    Alles schön und gut, funktioniert auch alles ohne Probleme.
    Wenn da nicht die Sache mit der "Animation" wäre, in dem Falle ein sich "ändernder" Text.
    Bewerkstelligt habe ich das einfach damit:

    while (main.Opacity < 1)
    {
        lstate.Text = "Loading " + string.Concat(Enumerable.Repeat(".", i++));
        if (i == 6)
            i = 0;
        Thread.Sleep(300);
    }


    Nun passiert es aber, dass der Splashscreen jedes mal einfriert, wenn ich nach Threadstart einige Funktionen aufrufe.
    Starte ich das allerdings in einem eigenen Prozess, dann bricht er diesen entweder sofort ab, oder wartet erst bis er die Funktionen durchgearbeitet hat und beginnt dann erst, den Text zu "animieren".

    Hier mal die "komplette" Variante:

    using System;
    using System.Threading;
    using System.Linq;
    using System.Windows.Forms;
    
    namespace Program
    {
        public partial class Start : Form
        {
            int i;
    
            public Start()
            {
                InitializeComponent();
    
                Thread spl = new Thread(strt);
                spl.Start();
    
                Main main = new Main();
                main.Show();
            }
    
            private void strt()
            {
                while (main.Opacity < 1)
                {
                    lstate.Text = "Loading " + string.Concat(Enumerable.Repeat(".", i++));
                    if (i == 6)
                        i = 0;
                    Thread.Sleep(300);
                }
            }
        }
    }

    Einer ne Idee, woran das liegt?
    Dachte ja erst, dass durch das Threaden die Funktion trotzdem weiterläuft, statt sich aufzuhängen und zu warten, bis die restlichen Funktionen beendet sind.

    In diesem Falle kann man den neuen Form-Aufruf auch einfach mit nem Sleep ersetzen, das Ergebnis bleibt dasselbe.

    Vielen Dank für die Hilfe.


    Dienstag, 10. April 2012 16:25

Alle Antworten

  • Hi,

    bekommst Du keine "cross thread operation not valid" Exception?

    ...bei

    > lstate.Text = "Loading " + string.Concat(Enumerable.Repeat(".", i++));

    Ich nehme an, dass lstate ein Label einer Form ist. Somit muss der Aufruf per Invoke passieren.

    Tipp: Benutze einen BackgroundWorker - der seine eventhandlers  wieder im UI-Thread aufruft (zum UI thread "zurückmarshalt").

    Viele Grüße,

      Thorsten


    Dienstag, 10. April 2012 17:29
  • Nein, bekomme ich nicht.

    Hatte es vor einer Weile schonmal mit einem BGW probiert, das ergebnis jedoch blieb dasselbe (die Form frohr ein).

    Und ja, lstate ist ein Label, vergaß ich zu erwähnen ;)

    Dienstag, 10. April 2012 17:52