Možné „spin off“ několik GUI závity? (Není zastavení systém na Application.Run)

hlasů
20

Můj cíl

Chtěl bych mít hlavní zpracování závit (bez GUI), a musí být schopen spin off GUI v jejich vlastních pozadí závity podle potřeby a mají můj hlavní non GUI vlákno pokračovat v práci. Jinak řečeno, chci, můj hlavní non-thread GUI být vlastníkem GUI nití a ne naopak. Nejsem si jist, že to je ještě možné s Windows Forms (?)

Pozadí

Mám systém založený na část, kde řadič dynamicky zatížení sestavy a instanci a spouštět třídy provedení společné IComponentrozhraní s jedinou metodou DoStuff().

Součásti, které, který se natáhne je konfigurován pomocí konfiguračního XML souboru a přidáním nových sestav, které obsahují různé implementace IComponent. Složky poskytuje pomocné funkce v hlavním řízení. Zatímco hlavní program je na tom, že je to věc, například regulaci jaderné elektrárny, komponenty mohou být plnění úkolů užitkové (v jejich vlastních nití), například čištění databáze, odesílání e-mailů, tisku vtipné vtipy na tiskárně, co tě mít. To, co bych chtěl, je mít jednu z těchto složek moci zobrazit GUI, např stavové informace o zmíněné odeslání e-mailové složky.

Životnost celého systému vypadá následovně

  1. spustí aplikace.
  2. Zkontrolujte, zda konfigurační soubor pro součásti načíst. Načíst je.
  3. Pro každou komponentu, spusťte DoStuff()jej inicializovat a učinit z něj žít svůj vlastní život do vlastních nití.
  4. Činit i nadále hlavní aplikační thingy král práce, a to navždy.

Ještě jsem nebyl schopen úspěšně provést bodu 3, pokud součást požáry GUI v DoStuff(). Je to prostě jen zastaví, dokud GUI je uzavřen. A teprve GUI je uzavřený dělá pokrok programu do bodu 4.

Bylo by skvělé, kdyby se tyto složky bylo umožněno nastartování GUI vlastní Windows Forms.

Problém

Když komponenta pokusí nahodit GUI v DoStuff()(přesný řádek kódu je, když je komponenta běží Application.Run(theForm)), součásti a tudíž náš systém „visí“ na Application.Run()lince, dokud se GUI je uzavřen. No, prostě vyhodil GUI funguje, jak se očekávalo.

Příklad komponentů. Jeden nemá nic společného s GUI, zatímco druhý požárů až roztomilý okna s růžové načechrané králíčci v nich.

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

Snažil jsem se to bez úspěchu. Dokonce i když se snažím, aby se oheň GUI do svého vlastního závitem, provedení zastaví až do GUI jako uzavřené.

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

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

Je možné vyčlenit GUI a vrátit se po Application.Run()?

Položena 05/08/2008 v 22:19
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
11

Application.Run způsob zobrazuje jeden (nebo více) formy a iniciuje standardní smyčka zpráv, která probíhá až do uzavření všechny formy. Nemůžete nutit výnos z této metody s výjimkou zavřením všech formulářů nebo vynucení vypnutí aplikace.

Můžete si však projít ApplicationContext (instad nové formy ()) k metodě Application.Run a ApplicationContext může být použita ke spuštění několik forem najednou. Vaše žádost skončí pouze tehdy, když všechny z nich jsou uzavřeny. Viz zde: http://msdn.microsoft.com/en-us/library/system.windows.forms.application.run.aspx

Také veškeré formuláře, které vám ukázat, non-modální poběží vedle vašeho hlavního formuláře, který vám umožní mít více než jedno okno, které neblokují každého jiný. Věřím, že to je vlastně to, co se snažíte dosáhnout.

Odpovězeno 05/08/2008 v 22:45
zdroj uživatelem

hlasů
0

Nejsem si jistý, jestli je to v pořádku, ale vzpomínám si běží okenní formulářů z aplikace konzoly pouhým newing formulář a volání newForm.Show () na tom, zda vaše složky používají, že namísto Application.Run () pak nový formulář by neměla blokovat.

Samozřejmě, že složka bude zodpovědný za zachování odkazu na formulářích, které vytvoří

Odpovězeno 23/05/2009 v 22:57
zdroj uživatelem

hlasů
0

Jsem si jist, že to je možné, pokud se zaseknout na to dost těžké, ale já bych naznačují, že není dobrý nápad.

‚Windows‘ (které vidíte na obrazovce) jsou velmi spojený s procesy. To znamená, že každý proces, který vykazuje některé GUI se očekává, že smyčka zpráv, které zpracovává všechny zprávy, které se podílejí na vytváření a správu oken (věci jako ‚klepnutí na tlačítko‘, ‚uzavřel aplikace‘, ‚překreslení obrazovky ' a tak dále.

Z tohoto důvodu, to je víceméně předpokládal, že pokud máte nějaké smyčka zpráv, musí být k dispozici po celou dobu životnosti vašeho procesu. Pro příklad okna vám mohl poslat ‚quit‘ zprávy, a musíte mít smyčku zprávu, která by zvládla, že i když máte nic na obrazovce.

Nejlepším řešením je to takhle:

Uskutečnění falešného formuláře, který je nikdy ukazován, který je vaše ‚hlavní app‘ Uvedení do provozu call Application.Run a předat v této falešné formě. Dělat svou práci v jiném vlákně a oheň události v hlavním vlákně, když je potřeba udělat Gui věci.

Odpovězeno 06/08/2008 v 00:22
zdroj uživatelem

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