Możliwe „spin off” kilka wątków GUI? (Nie zatrzymanie systemu w Application.Run)




**Mój cel**


Chciałbym mieć główny wątek przetwarzania (bez GUI), i być w stanie wydzielić GUI w ich własnych wątków tła, ile potrzeba, i posiadające mój główny wątek GUI nie kontynuować pracę. Innymi słowy, chcę mój główny wątek non-GUI być właściciel GUI wątku, a nie odwrotnie. Nie jestem pewien, że to jest w ogóle możliwe z Windows Forms (?)


**tło**


Mam system oparty komponentowego, w którym kontroler dynamicznie załadować zespoły i instancję i prowadzić zajęcia wykonawczych wspólny `IComponent`interfejs z jednej metody `DoStuff()`.


Które składniki który jest ładowany jest skonfigurowany poprzez plik konfiguracyjny XML i dodając nowe zestawy zawierające różne implementacje `IComponent`. Składniki zapewnia funkcje użytkowe do głównej aplikacji. Podczas gdy główny program robi to rzecz, np sterowania elektrowni jądrowej, składniki mogą być wykonywanie zadań użytkowych (w ich własnych wątków), np czyszczenie bazy danych, wysyłanie wiadomości e-mail, drukowanie śmieszne drukarkę, co cię mieć. Chciałbym, ma mieć jeden z tych elementów w stanie wyświetlać GUI, np informacje o stanie dla wspomnianego komponentu e-mail wysyłanie.


Żywotność całego układu wygląda następująco


1. uruchamia aplikację.
2. Sprawdzić plik konfiguracyjny dla elementów do załadowania. Załadować je.
3. **Dla każdego komponentu, należy uruchomić `DoStuff()`, aby go zainicjować i sprawiają, że żyć własnym życiem w ich własnych wątków.**
4. Nadal do głównego aplikacji Thingy króla pracy, na zawsze.


I jeszcze nie były w stanie skutecznie wykonywać pkt 3, jeżeli składnik wystrzeliwuje się w GUI `DoStuff()`. To po prostu tylko zatrzymuje aż GUI jest zamknięta. I dopiero GUI jest zamknięty robi postępy programu do punktu 4.


Byłoby wspaniale, jeśli składniki te zostały dopuszczone do uruchomienia własnej Windows Forms GUI.


**Problem**


Gdy składnik próbuje odpalić w GUI `DoStuff()`(dokładna linia kodu jest, gdy składnik działa `Application.Run(theForm)`), komponent i stąd nasz system „zawiesza się” na `Application.Run()`linii aż GUI jest zamknięta. Cóż, po prostu wystrzelił w górę GUI działa dobrze, jak oczekiwano.


Przykład składników. Jeden ma nie ma nic wspólnego z GUI, podczas gdy drugi pożary górę słodkie okna z różowym puszyste króliczki w 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.
    }
}

```

Próbowałem to bez powodzenia. Nawet gdy próbuję odpalić GUI w jego własnym wątku, wykonanie zatrzymuje aż GUI jako zamknięte.



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

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

```

Czy to możliwe, aby wydzielić GUI i powrót po `Application.Run()`?
**Application.Run** sposób najmniej jedną (lub więcej) formy i inicjuje standardowego pętli wiadomość, która prowadzi aż wszystkie formy są zamknięte. Nie można wymusić powrót z tej metody tylko przez zamknięcie wszystkich formularzy lub wymuszając zamknięcie aplikacji.


Można jednak przekazać **ApplicationContext** (instad nowej formy ()) do metody Application.Run ApplicationContext i mogą być wykorzystane do uruchomienia kilku formach jednocześnie. Aplikacja będzie tylko kończy się, gdy wszystkie te są zamknięte. Zobacz tutaj: <http://msdn.microsoft.com/en-us/library/system.windows.forms.application.run.aspx>


Ponadto, wszelkie formy, które można pokazać pojedynczymi blokami będą działać obok głównego formularza, który pozwoli Ci mieć więcej niż jednego okna, które nie blokują się nawzajem. Wierzę, że to jest rzeczywiście to, co staramy się osiągnąć.
zbugowane jest po tych przebudowach interfejsu do konfiguracji. mi np. nie działa jak wywołam zasady okien z menu paska tytułowego. 
co do ff to mi działa ukrywanie paska tytułowego przy tych ustawieniach: 
 [[obraz]](https://techforum.wpcdn.pl/original/3x/5/9/59702d6868854de4ab58bd10771c5559578691e3.png "obraz.png")
(tylko konfigurowałem jeszcze używając starego interfejsu do zmiany tych ustawień) cześć uruchom console(powinna być widoczna zawsze jeśli programujesz) tam będą informacje z procesu buildowania, ogólne dotyczące pomniejszych bugów w kodzie i ewentualne errory, jest tez dostępny chyba pełny log ze szczegółami pozwalający wykryć problem z buildem, unity->window->general->console ni… Czy to znaczy że raz rozpoczęta aplikacja nie chce się skończyć? Czy aktualizacje pobierają się wiele razy? 
  

  
Opisz swój problem dokładniej, chętnie pomożemy. dokładnie jest tak jak piszesz. jednordzeniowa aplikacja będzie działała na jednym rdzeniu ale sam system potrafi korzystać z wielu rdzeni. dlatego będzie te rdzenie rozdzielał na poszczególne aplikacje. pamiętaj też że uruchamiając jedną aplikację w tle działa ponad setka innych procesów które będą… sam próbowałem w tym programować, ale nie ma w nim opcji tworzenia pliku wykonywalnego(*.exe)

jeśli chcesz programować w visual basic to zainstaluj legalnego windowsa (chyba że masz legalnego)
i ściągnij ze strony [[link]](http://www.microsoft.pl)

znajdź tam link "programowanie" a tam znajdziesz wszystko.

pozdrawiam! 
 ricko kl wątek do zamknięcia. dla początkujących w go, przy importowaniu paczki na początku dajemy nazwę modułu, później pakietu :smiley: to wiem. podałem tylko przykład komendy zwiększającej priorytet.

chcę automatycznie uruchomić program z wyższym priorytetem, docelowo jako zwykły użytkownik.

zastanawiam się, czy można by było np. uruchomić go jak w przykładzie, a potem (jakoś?) automatycznie zmienić użytkownika z root’a na zwykłe… w sumie to drugim problemem jest prompt, robi z zmiennych tekst: 
var a=prompt("podaj długość boku a" , "")
var b=prompt("podaj długość boku b" , "")
var c=prompt("podaj długość boku c" , "")
var a = parsefloat(a);
var b = parsefloat(b);
var c = parsefloat(c);

chyba, że to typowe tylko dla firefox,… i tak będziesz z każdym zadaniem przychodzić tutaj? :stuck\_out\_tongue:

po każdej zmiennej powpisuj sobie czytelne komunikaty w print'ach z aktualną wartością zmiennej i będziesz wszystko wiedzieć jak program się wykonuje.

tutaj akurat masz pętlę while z warunkiem x < 5, i w niej zagnieżdżoną drugą… [g.txt](https://forum.dobreprogramy.pl/applications/core/interface/file/attachment.php?id=14865)