GUI im Thread, OpenFileDialog will STAThread

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • GUI im Thread, OpenFileDialog will STAThread

    Hallo,

    Ich habe ein Problem mit den Threads. Für eine vorhandene aus xy Projekten bestehende Projektmappe muss ich einen neuen Projekt schreiben. Mein Projekt muss als Klassenbibliothek angelegt werden (also nicht Windows-Forms-Anwendung, obwohl es eine GUI hat). Ich bekomme von dem Prozessor Aufmerksamkeit durch eine init-methode und muss Einstellungen durch die GUI vornehmen bis ich dann die init-methode loslassen kann. Ich habe mir eine Warteschleife gebastelt und die GUI in einen Thread gepackt.

    Quellcode

    1. Thread newThread;
    2. automatonComponent = new AutomatonVisualizationForm();
    3. newThread = new Thread(() => Application.Run(automatonComponent));
    4. newThread.Start();
    5. while (!newThread.IsAlive);
    6. while (!automatonComponent.isSimulationInitialized) {
    7. Thread.Sleep(500);
    8. }


    Soweit ich aber versuche in der GUI, die in dem Thread gestartet ist, OpenFileDialog zu öffnen, bekomme ich Exception (bzw. eine Anmerkung, die bei der Ausführung außerhalb des Debug-Modus nicht auftreten sollte, wie es da steht). Da steht dass der Thread, der das Dialog ausführt, eine STAThread Markierung haben muss. Genauer:

    Für den aktuellen Thread muss der STA-Modus (Single Thread Apartment) festgelegt werden, bevor OLE-Aufrufe ausgeführt werden können. Stellen Sie sicher, dass die Hauptfunktion mit STAThreadAttribute gekennzeichnet ist. Diese Ausnahme wird nur ausgelöst, wenn ein Debugger mit dem Prozess verbunden ist.


    Quellcode

    1. OpenFileDialog gvDialog = new OpenFileDialog();
    2. gvDialog.Multiselect = false;
    3. gvDialog.Filter = "GV-Datei|*.gv";
    4. if (gvDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { //tritt hier auf
    5. txt_adf_path.Text = gvDialog.FileName.Replace("\\", "/");
    6. }
    7. if (txt_adf_path.Text != "" && txt_adj_path.Text != "") {
    8. cmd_visualize.Enabled = true;
    9. }


    Wenn ich nun keine Hauptfunktion habe, wie soll ich vorgehen?
    Ich habe versucht den OpenFileDialog in separaten Thead auszulagern, war aber doofe Idee... kam dasselbe raus.

    Hat jemand eine Idee?
  • In letzter Zeit Antworte ich mir irgendwie immer selbst nach kürzester Zeit... :D Was lernen wir daraus? Länger denken und suchen, erst danach posten...

    Quellcode

    1. Thread newThread;
    2. newThread = new Thread(createAutomatonVisualizationForm);
    3. newThread.SetApartmentState(ApartmentState.STA);
    4. newThread.Start();
    5. while (!newThread.IsAlive);
    6. Thread.Sleep(1000); //sleep while automatonComponent is initializing
    7. while (!automatonComponent.isSimulationInitialized) {
    8. Thread.Sleep(500);
    9. }


    Quellcode

    1. private void createAutomatonVisualizationForm() {
    2. automatonComponent = new AutomatonVisualizationForm();
    3. Application.Run(automatonComponent);
    4. }



    Abhilfe hat der Funktionsaufruf SetApartmentState(ApartmentState.STA) (Methode der Thread-Klasse) geschaffen.

    Gruß