Autor Beitrag
ebber
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 239
Erhaltene Danke: 1

Win XP, Win 7
C# (VS 2010), Delphi (2007), Expression 4
BeitragVerfasst: Do 25.12.08 16:25 
Hallo,

ich möchte ein neues Fenster erstellen, welches in einem eigenen Thread laufen soll. Ich habe das mal so versucht:

ausblenden C#-Quelltext
1:
2:
        Thread thr = new Thread(new ThreadStart(dosth));
        thr.Start();


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
        public void dosth()
        {
            Window2 win = new Window2();
            win.Show();
        }


Fast häts geklappt :) . Es meinte allerdings, es müsse ein STA Thread sein. Dann bin ich auf diese Zeile gestoßen:

ausblenden C#-Quelltext
1:
thr.TrySetApartmentState(ApartmentState.STA);					


Dadurch kam der Fehler:
ausblenden Quelltext
1:
2:
3:
Additional Information: Eine verwaltete Ausführung wird innerhalb der Sperre für den OS-Loader versucht. 
Versuchen Sie nicht, verwalteten Code innerhalb einer DllMain- oder Bildinitialisierungsfunktion auszuführen, 
da dies ein Hängen der Anwendung zur Folge haben kann.


Ich kenne mich mit Threading relativ wenig aus. Funktioniert das überhaupt was ich vor habe? Es soll praktisch diese Form nicht blockieren, wenn die Main Form eventuell blockiert wird.

// Ist eine WPF Form (weis nicht ob das wichtig ist)

MfG
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 25.12.08 16:27 
Ich glaube, die wichtigste Frage ist erst einmal, warum Du das überhaupt tun willst. Es ist, soweit ich weiß, völlig unüblich die GUI in einen anderen Thread zu packen. Die Hintergrund-Prozesse, die macht man oft in andere Threads. Aber eine die GUI selber :gruebel:

Die Frage ist doch sowieso, was mit der GUI passiert, wenn der Thread fertig ist (also Deine Methode durchgelaufen). Die dürfte da doch eigentlich "entsorgt" werden.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
ebber Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 239
Erhaltene Danke: 1

Win XP, Win 7
C# (VS 2010), Delphi (2007), Expression 4
BeitragVerfasst: Do 25.12.08 16:39 
Deiner Antwort entnehme ich mal, dass ich besser darauf schauen sollte, dass meine Main Form nicht blockiert. Das ist leider etwas schwierig, deshalb auch die ganze Idee.

Dass der Thread irgendwann mal fertig ist und meine Form dann "entsorgt" wird, daran hatte ich nicht so direkt gedacht.

Dann muss ich das wohl ein wenig komplizierter lösen.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 25.12.08 16:44 
Du kannst auch einfach mal erkären, wo das eigentliche Problem liegt, dann kann man vielleicht eine bessere Lösung finden :-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
ebber Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 239
Erhaltene Danke: 1

Win XP, Win 7
C# (VS 2010), Delphi (2007), Expression 4
BeitragVerfasst: Do 25.12.08 16:50 
Im Prinzip habe ich das am Anfang schon gesagt. Meine 2. Form soll nicht blockieren wenn die Main Form blockiert.

Auf der 2. Form sind einige Bedienelemente (buttons...), diese soll man immer benutzen können. Das Problem ist, dass die Main Form ab und zu mal wieder für ein paar sek hängt. Das aber wiederum an einigen verschiedenen Stellen. Ich müsste da also einige Funktionen in einen Backroundworker oder sowas packen.

Deshalb dachte ich es ist einfacher ich packe einfach die andere Form in einen anderen Thread.

Die andere Lösung ist eben ein wenig umständlicher, aber immer noch akzeptabel und so wie mir scheint die eindeutig schönere.

MfG
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 25.12.08 17:05 
user profile iconebber hat folgendes geschrieben Zum zitierten Posting springen:
Die andere Lösung ist eben ein wenig umständlicher, aber immer noch akzeptabel und so wie mir scheint die eindeutig schönere.

Genauso ist es.

Zusatzhinweis: Wenn Aufgaben aus dem MainForm länger dauern und ggf. blockieren, dann muss man sich damit befassen und nicht mit irgendeinem Ersatzverfahren, das mit dem Problem überhaupt nichts zu tun hat.

Gruß und Frohe Weihnachten! Jürgen
ebber Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 239
Erhaltene Danke: 1

Win XP, Win 7
C# (VS 2010), Delphi (2007), Expression 4
BeitragVerfasst: Do 25.12.08 17:14 
Zitat:

dann muss man sich damit befassen und nicht mit irgendeinem Ersatzverfahren

Da muss ich dir im Prinzip ausnahmslos zustimmen.

Als ich allerdings bei mir den Aufwand mit dem Ergebnis und für was es gut ist abgewägt hatte, dann war mir in diesem Moment doch eine schnellere Lösung lieber. :oops:

Zitat:

Gruß und Frohe Weihnachten!


Gleichfalls. Und auch an alle Anderen.