Πιθανά να «spin off» πολλά θέματα GUI; (Δεν ανάσχεση του συστήματος σε Application.Run)

ψήφοι
20

Ο στόχος μου

Θα ήθελα να έχουμε ένα κύριο νήμα επεξεργασίας (μη GUI), και να είναι σε θέση να spin off GUIs το δικό τους υπόβαθρο θέματα, όπως απαιτείται, και των οποίων η κύρια μη νήμα GUI μου συνεχίσουμε να δουλεύουμε. Με άλλα λόγια, θέλω κύρια μη γραφικό περιβάλλον νήμα μου να είναι ο ιδιοκτήτης του GUI-νήμα και όχι το αντίστροφο. Δεν είμαι σίγουρος ότι αυτό είναι ακόμη δυνατό με τα Windows Forms (;)

Ιστορικό

Έχω ένα σύστημα που βασίζεται συστατικό στο οποίο ένας ελεγκτής φορτώσει δυναμικά συγκροτήματα και instantiates και να τρέξει τάξεις την εφαρμογή κοινής IComponentδιεπαφής με μια ενιαία μέθοδο DoStuff().

Τα οποία συστατικά που παίρνει φορτωθεί έχει ρυθμιστεί μέσω ενός αρχείο ρυθμίσεων XML και με την προσθήκη νέων συγκροτημάτων που περιέχουν διαφορετικές υλοποιήσεις της IComponent. Τα συστατικά παρέχει λειτουργίες χρησιμότητας για την κύρια εφαρμογή. Ενώ το κύριο πρόγραμμα κάνει αυτό είναι το πράγμα, π.χ. τον έλεγχο ενός πυρηνικού εργοστασίου, τα συστατικά μπορεί να εκτελεί τα καθήκοντα κοινής ωφελείας (στη δική τους θέματα), π.χ. καθαρισμός της βάσης δεδομένων, αποστολή μηνυμάτων ηλεκτρονικού ταχυδρομείου, εκτύπωση αστεία αστεία για τον εκτυπωτή, τι έχετε. Αυτό που θέλω, είναι να έχουμε ένα από αυτά τα συστατικά να είναι σε θέση να εμφανίσει ένα γραφικό περιβάλλον, π.χ. με πληροφορίες κατάστασης για την εν λόγω αποστολή email στοιχείο.

Η διάρκεια ζωής του πλήρους συστήματος μοιάζει με αυτό

  1. Η εφαρμογή ξεκινά.
  2. Ελέγξτε το αρχείο ρυθμίσεων για τα συστατικά για να φορτώσει. Τοποθετήστε τους.
  3. Για κάθε στοιχείο, τρέχει DoStuff()για να προετοιμαστεί και να το ζήσει τη δική του ζωή στη δική τους θέματα.
  4. Συνεχίστε να κάνετε την κύρια προσφυγή-πραγματάκι βασιλιά της εργασίας, για πάντα.

Δεν έχω ακόμη σε θέση να εκτελέσει με επιτυχία το σημείο 3, εάν το στοιχείο πυρκαγιές ένα GUI σε DoStuff(). Είναι απλά σταματάει μέχρι το GUI είναι κλειστό. Και όχι μέχρι το GUI είναι κλειστό κάνει την πρόοδο του προγράμματος σε σημείο 4.

Θα ήταν μεγάλη, αν αυτά τα στοιχεία είχαν τη δυνατότητα να ξεκινήσουν τη δική τους Windows Forms γραφικά περιβάλλοντα.

Πρόβλημα

Όταν ένα στοιχείο προσπαθεί να ανάψουν ένα γραφικό περιβάλλον στο DoStuff()(η ακριβής γραμμή του κώδικα είναι, όταν το συστατικό τρέχει Application.Run(theForm)), το στοιχείο και ως εκ τούτου μας σύστημα «κολλάει» στην Application.Run()γραμμή μέχρι το GUI είναι κλειστό. Λοιπόν, το μόνο φωτιά επάνω GUI δουλεύει μια χαρά, όπως αναμενόταν.

Παράδειγμα των συστατικών. Κάποιος δεν έχει τίποτα να κάνει με το GUI, ενώ το δεύτερο πυρκαγιές μέχρι ένα χαριτωμένο παράθυρα με ροζ χνουδωτό λαγουδάκια σε αυτά.

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.
    }
}

Έχω δοκιμάσει αυτό με καμία τύχη. Ακόμα και όταν προσπαθώ να ανάψουν το GUI στο δικό του νήμα, η εκτέλεση σταματά μέχρι το GUI όπως κλειστά.

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

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

Είναι δυνατόν να spin off ένα γραφικό περιβάλλον και να επιστρέψει μετά Application.Run();

Δημοσιεύθηκε 05/08/2008 στις 22:19
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
11

Application.Run μέθοδος εμφανίζει μία (ή περισσότερες) μορφές και εκκινεί την τυπική βρόχο μήνυμα το οποίο τρέχει έως ότου όλα τα έντυπα κλειστά. Δεν μπορεί να αναγκάσει την επιστροφή από την εν λόγω μέθοδο, εκτός από το κλείσιμο όλες τις μορφές σας ή αναγκάζοντας μια διακοπή λειτουργίας της εφαρμογής.

Μπορείτε, ωστόσο, να περάσει ένα ApplicationContext (instad μιας νέας μορφής ()) με τη μέθοδο Application.Run και ApplicationContext μπορεί να χρησιμοποιηθεί για να ξεκινήσει διάφορες μορφές ταυτόχρονα. Η αίτησή σας θα τελειώσει μόνο όταν όλα αυτά είναι κλειστά. Δείτε εδώ: http://msdn.microsoft.com/en-us/library/system.windows.forms.application.run.aspx

Επίσης, όλα τα έντυπα που σας Εμφάνιση μη στους τρόπους θα συνεχίσει να λειτουργεί παράλληλα με την κύρια φόρμα σας, που θα σας επιτρέψει να έχετε περισσότερα από ένα παράθυρα που δεν αποκλείουν η μία την άλλη. Πιστεύω ότι αυτό είναι στην πραγματικότητα αυτό που προσπαθεί να επιτύχει.

Απαντήθηκε 05/08/2008 στις 22:45
πηγή χρήστη

ψήφοι
0

Δεν είμαι σίγουρος αν αυτό είναι σωστό, όμως θυμάμαι τρέχει μορφές παράθυρο από μια εφαρμογή κονσόλας από μόνο αναζωογονητικές τη φόρμα και καλώντας newForm.Show () σε αυτό, αν τα υλικά μας χρησιμοποιούν ότι αντί της Application.Run (), τότε το νέο μορφή δεν θα πρέπει να δεσμεύσουν.

Φυσικά, το στοιχείο θα είναι υπεύθυνη για τη διατήρηση αναφορά στις μορφές που δημιουργεί

Απαντήθηκε 23/05/2009 στις 22:57
πηγή χρήστη

ψήφοι
0

Είμαι σίγουρος ότι αυτό είναι δυνατό, αν έχετε χαράξει κανείς αρκετά σκληρά, αλλά εγώ θα πρότεινα να μην είναι μια καλή ιδέα.

«Παράθυρα» (που βλέπετε στην οθόνη) είναι ιδιαίτερα συνδεδεμένη με τις διαδικασίες. Δηλαδή, κάθε διαδικασία η οποία εμφανίζει οποιοδήποτε γραφικό περιβάλλον αναμένεται να έχει ένα βρόχο μήνυμα, το οποίο επεξεργάζεται όλα τα μηνύματα που ασχολούνται με τη δημιουργία και τη διαχείριση των Windows (τα πράγματα όπως «κλικ στο κουμπί», «έκλεισε το app», «αναδιατυπώσει την οθόνη ' και ούτω καθεξής.

Εξαιτίας αυτού, είναι περισσότερο ή λιγότερο θεωρείται ότι αν έχετε οποιαδήποτε βρόχο μήνυμα, πρέπει να είναι διαθέσιμη για τη διάρκεια της διαδικασίας σας. Για παράδειγμα, τα Windows μπορεί να σας στείλει ένα μήνυμα «κόψει» και θα πρέπει να έχετε έναν βρόχο μήνυμα διαθέσιμος για να αντιμετωπίσει ότι, ακόμη και αν έχετε τίποτα στην οθόνη.

Ο καλύτερος τρόπος είναι να το κάνουμε κάπως έτσι:

Κάντε μια ψεύτικη μορφή που δεν εμφανίζεται ποτέ ποια είναι η «κύρια εφαρμογή» σας Εκκίνηση κλήσεων Application.Run και να περάσει σε αυτό το ψεύτικο μορφή. Κάντε τη δουλειά σας σε ένα άλλο νήμα, και τα γεγονότα φωτιά στο κύριο νήμα όταν χρειάζεται να κάνετε Gui πράγματα.

Απαντήθηκε 06/08/2008 στις 00:22
πηγή χρήστη

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