3 Stimmen

Daten laden und dabei einen Begrüßungsbildschirm anzeigen

Ich habe einige Daten aus einer db4o-Datenbank zu laden, die 1 oder 2 Sekunden beim Start meiner app dauert, der Rest hat zu warten, weil zunächst die Daten geladen werden muss. tun dies in einem eigenen Thread würde bedeuten, dass der Rest für die Thread-Finishing warten muss. Ich möchte einen Splash-Screen oder etwas zu tun, während die Daten geladen wird, für die auch einen eigenen Thread benötigen, richtig? wie würden Sie tun?

Ich verwende csharp, .net 3.5 und winforms

5voto

MusiGenesis Punkte 72729

Die Anzeige eines Startbildschirms beim Starten ist einfach zu bewerkstelligen. Fügen Sie in der Main()-Methode Ihrer Anwendung (in Program.cs) vor der Zeile Application.Run(...) etwas wie das Folgende ein:

SplashForm splashy = new SplashForm();
splashy.Show();
Application.Run(new MainForm(splashy));

Ändern Sie den Code und den Konstruktor für Ihr Hauptformular so, dass es etwa so aussieht:

private SplashForm _splashy;
public MainForm(SplashForm splashy)
{
    _splashy = splashy;
    InitializeComponent();
}

Dann fügen Sie am Ende des Load-Ereignisses Ihrer MainForm (das vermutlich den Datenbankcode enthält) folgenden Code ein:

_splashy.Close();
_splashy.Dispose();

Wenn Sie sich dafür entscheiden, den Datenbankzugriff mit einem separaten Thread oder BackgroundWorker durchzuführen, dann brauchen Sie nicht wirklich einen Splash-Screen, sondern eine Art Fortschrittsanzeige, die erscheint, während der BackgroundWorker seine Arbeit erledigt. Das würde anders gemacht werden als meine Antwort hier.

1voto

Trevor Ash Punkte 623

Eine Möglichkeit, aber wahrscheinlich gibt es bessere Möglichkeiten. Erstellen Sie ein neues Dialogformular, das Ihr Fortschrittsfenster/Splash-Screen sein wird. Fügen Sie ein Bitmap oder was auch immer als einziges Element hinzu. Instanziieren Sie den Dialog aus Ihrem Hauptprogramm. Überschreiben Sie das Load-Ereignis für das Fortschrittsformular und starten Sie von dort aus den neuen Thread, der die Hintergrundverarbeitung zum Laden der Daten übernimmt. Auf diese Weise können Sie ShowDialog einfach aus Ihrer Hauptanwendung aufrufen.

Wenn Sie System.ComponentModel.BackgroundWorker verwenden, dann können Sie einfach Ereignisse für die Beendigung des Threads und das automatische Beenden des Dialogs von diesem Ereignis aus verdrahten. Die Kontrolle wird an die aufrufende Anwendung zurückgegeben und Sie sind fertig.

Ich habe diese Art von Sache in einer Anwendung vor getan und es funktioniert gut, aber ich bin sicher, es ist ein Anfänger Ansatz. Hier ist Beispielcode aus dem Load-Ereignis im Formular, das den Hintergrund-Thread startet (in meinem Fall öffne ich große Dateien und analysiere sie):

 private void FileThreadStatusDialog_Load(object sender, EventArgs e)
 {
Cursor = Cursors.WaitCursor;

if (m_OpenMode)
{
    this.Text = "Opening...";
    StatusText.Text = m_FileName;
    FileThread = new BackgroundWorker();
    FileThread.RunWorkerCompleted += new RunWorkerCompletedEventHandler(FileThread_RunWorkerCompleted);
    FileThread.DoWork += new DoWorkEventHandler(FileOpenThread_DoWork);
    FileThread.WorkerSupportsCancellation = false;
    FileThread.RunWorkerAsync();
}
else
{
    this.Text = "Saving...";
    StatusText.Text = m_FileName;
    FileThread = new BackgroundWorker();
    FileThread.RunWorkerCompleted += new RunWorkerCompletedEventHandler(FileThread_RunWorkerCompleted);
    FileThread.DoWork += new DoWorkEventHandler(FileSaveThread_DoWork);
    FileThread.WorkerSupportsCancellation = false;
    FileThread.RunWorkerAsync();
}

}

Und so sieht die Methode "Work completed" aus, die das Formular enthält:

private void FileThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    FileThread = null;
        DialogResult = DialogResult.OK;
        Close();
}

So öffne ich den Fortschrittsdialog über den Hauptdialog:

FileThreadStatusDialog thread = new FileThreadStatusDialog(m_Engine, dlg.FileName, true);
if (thread.ShowDialog(this) == DialogResult.OK)
{
        m_Engine = thread.Engine;
    FillTree();
}

1voto

nrodic Punkte 2993

Man könnte die Zeichnung von splashy in MusiGenesis' Antwort erzwingen, indem man hinzufügt

Application.DoEvents();

unmittelbar nach

splashy.Show();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X