Mögliche zu "Spin-off" mehrere GUI-Threads? (Nicht Anhalten des Systems bei Application.Run)

stimmen
20

Mein Ziel

Ich möchte eine Hauptverarbeitungsthread (nicht GUI) haben und in der Lage sein GUIs in ihrem eigenen Hintergrund-Threads spin-off je nach Bedarf, und mit meinem Haupt nicht GUI-Thread weiter arbeiten. Um es anders auszudrücken, mag ich mein Haupt nicht GUI-Thread der Besitzer des GUI-Thread und nicht umgekehrt. Ich bin mir nicht sicher, dass dies mit Windows Forms auch möglich ist (?)

Hintergrund

Ich habe eine Komponente basiertes System , in dem ein Controller dynamisch Baugruppen und Instantiiert und führten Klassen laden , einen gemeinsamen Durchführung IComponentSchnittstelle mit einem einzigen Verfahren DoStuff().

Welche Komponenten , die über eine XML - Konfigurationsdatei konfiguriert ist , und durch Hinzufügen neuer Baugruppen mit unterschiedlichen Implementierungen geladen wird IComponent. Die Komponenten bieten Utility - Funktionen auf die Hauptanwendung. Während das Hauptprogramm tut , was es ist, zum Beispiel ein Atomkraftwerk zu steuern, können die Komponenten durchführen Dienstprogramm Aufgaben werden (in ihren eigenen Threads), zB die Datenbank Reinigung, E - Mails senden, Drucken lustige Witze auf dem Drucker, was Sie haben. Was ich möchte, ist eine dieser Komponenten haben kann , eine GUI angezeigt werden , zB mit Statusinformationen für die genannte E - Mail - Sendekomponente.

Die Lebensdauer des gesamten Systems sieht wie folgt aus

  1. Anwendung startet.
  2. Überprüfen Konfigurationsdatei für Komponenten zu laden. Legen Sie sie.
  3. Für jede Komponente, führen DoStuff()sie zu initialisieren und sie ihr eigenes Leben in ihren eigenen Threads machen leben.
  4. Weiter Haupt-Dingen König von Arbeit zu tun, für immer.

Ich habe noch nicht gelungen, erfolgreich 3 - Punkt auszuführen , wenn die Komponente eine GUI in Brände DoStuff(). Es ist einfach stoppt nur , bis die GUI geschlossen ist. Und erst , wenn die GUI geschlossen ist funktioniert das Programm Fortschritte Punkt 4.

Es wäre toll, wenn diese Komponenten erlaubt wurden, ihre eigenen Windows Forms-GUIs zu starten.

Problem

Wenn eine Komponente versucht , eine GUI in anwerfen DoStuff()(die genaue Codezeile ist , wenn die Komponente läuft Application.Run(theForm)), die Komponente und damit unser System „hängt“ an der Application.Run()Linie , bis die GUI geschlossen ist. Nun, die gerade gefeuert GUI funktioniert gut, wie erwartet.

Beispiel von Komponenten. Man muss nichts nicht mit GUI zu tun, während des zweiten Feuers auf ein niedliches Fenster mit rosa flauschigen Häschen in ihnen.

public class MyComponent1: IComponent
{
    public string DoStuff(...) { // write something to the database  }
}

public class MyComponent2: IComponent
{
    public void DoStuff()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form());

        // I want the thread to immediately return after the GUI 
        // is fired up, so that my main thread can continue to work.
    }
}

Ich habe schon versucht, diese ohne Glück. Auch wenn ich versuche, die GUI in einem eigenen Thread zu feuern, stoppt die Ausführung, bis die GUI als geschlossen.

public void DoStuff()
{
    new Thread(ThreadedInitialize).Start()
}

private void ThreadedInitialize()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form());
}

Ist es möglich , eine GUI und zurück nach ausgliedern Application.Run()?

Veröffentlicht am 05/08/2008 um 22:19
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
11

Application.Run Methode zeigt eine (oder mehr) Formen und initiiert die Standardnachrichtenschleife , die ausgeführt wird, bis alle die Formen geschlossen sind. Sie können nicht eine Rückkehr von dieser Methode erzwingen , außer durch alle Formen oder zwingt eine Anwendung Shutdown schließen.

Sie können jedoch einen Pass Application (instad einer neuen Form ()) nach Application.Run Methode und Application verwendet werden kann mehrere Formen auf einmal zu starten. Ihre Bewerbung wird nur enden , wenn alle, die geschlossen sind. Siehe hier: http://msdn.microsoft.com/en-us/library/system.windows.forms.application.run.aspx

Außerdem werden alle Formulare, die Sie nicht-modal anzeigen wird auch weiterhin neben Ihrer Hauptform laufen, die Sie ermöglichen wird, mehr als ein Fenster zu haben, die sich nicht gegenseitig blockieren. Ich glaube, das ist eigentlich das, was Sie versuchen zu erreichen.

Beantwortet am 05/08/2008 um 22:45
quelle vom benutzer

stimmen
0

Ich bin mir nicht sicher, ob dies richtig ist, aber ich Fensterformen von einer Konsolenanwendung Speicher läuft nur durch die Form Newing und rufe newForm.Show () auf es, wenn Sie Ihre Komponenten, dass anstelle von Application.Run () dann den neuen Form sollte nicht blockieren.

Natürlich wird die Komponente für die Aufrechterhaltung einer Bezugnahme auf die Formen verantwortlich, die er schafft

Beantwortet am 23/05/2009 um 22:57
quelle vom benutzer

stimmen
0

Ich bin sicher, dass dies möglich ist, wenn man es schwer genug hacken, aber ich würde vorschlagen, dass es keine gute Idee ist.

‚Windows‘ (die Sie auf dem Bildschirm zu sehen) sind Prozesse sehr verbunden. Das heißt, jeder Prozess, der zeigt jede GUI erwartet wird, eine Nachrichtenschleife haben, die alle Nachrichten verarbeitet, die mit der Erstellung und Verwaltung von Fenstern beteiligt sind (Dinge wie ‚die Schaltfläche geklickt‘, ‚schlossen die App‘, ‚neu zeichnen den Bildschirm ' und so weiter.

Aus diesem Grunde ist es mehr oder weniger wird angenommen, dass, wenn Sie eine Nachrichtenschleife haben, muss es für die Lebensdauer des Prozesses zur Verfügung. Zum Beispiel Fenster können Sie ein ‚beenden‘ Nachricht senden, und Sie müssen eine Nachrichtenschleife haben, dass zur Verfügung zu behandeln, auch wenn Sie nichts auf dem Bildschirm haben.

Ihre beste Wette ist es wie folgt tun:

Machen Sie eine gefälschte Form, die nie gezeigt wird, das ist Ihre ‚Hauptanwendung‘ Start Call Application.Run und in dieser gefälschten Form übergeben. Haben Sie Ihre Arbeit in einem anderen Thread, und Brandereignisse an dem Haupt-Thread, wenn Sie Gui Sachen müssen tun.

Beantwortet am 06/08/2008 um 00:22
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more