2011-01-02 9 views
1

Ich habe seltsames Problem.C# Form eines Formulars ist auf separaten Thread

Ich habe 3 Formen. Formular1, Formular2, Formular3.

Formular1 ist Start/Hauptformular. in form1 Ich habe Code:

form2 f2 = new form2; 
f2.ShowDialog(); 

form2 öffnet, kann ich nicht auf foorm1 konzentrieren, sind sie beide auf dem gleichen Thread. Genau was ich will.

Auf form2 Ich habe Code:

form3 f3 = new form3; 
DialogResult result = f3.ShowDialog(); 

ich diesen Code ausführen und ... Für einige unbekannt für mich form3 auf neuen Thread läuft Vernunft und ich auf form2 konzentrieren können. Ich möchte nicht, dass das passiert. Ich habe keine Ahnung, warum dieses Formular3 auf neuem Thread läuft. Ich kann DialogResult nicht verwenden, weil es zu einem Fehler führt (Cross-Thread).

Es verhält sich, als ob ich f3.Show(), aber ich benutze f3.ShowDialog();

Als Sie im Voraus.

P.S.

Wenn ich

form3 f3 = new form3; 
DialogResult result = f3.ShowDialog(this); 

ich dies habe:

System.InvalidOperationException Code unhandled durch Benutzer war
Message = Cross-Thread-Betrieb nicht gültig: Control 'form2' zugegriffen von einem Thread anders als der Thread war es erstellt am.

auf dieser Linie:

DialogResult result = f3.ShowDialog(this); 
+1

Warum denken Sie, dass sie auf separaten Threads sind? –

+0

@Conrad Frinx Das ist eine dumme Frage. Sie können die Thread-Nummer im Formular anzeigen und sogar die Anzahl der Threads in ProcExplorer – Hooch

+0

@Hooch überprüfen. Ich bin nicht derjenige mit dem Problem. –

Antwort

3

Dialoge Funktion durch ihre eigene Nachrichtenschleife implementieren. Da beide Threads über eine Nachrichtenschleife verfügen, die Nachrichten verarbeitet, haben Sie zwei Dialoge aktiviert. Entweder den ersten Dialog manuell deaktivieren oder alle Dialoge vom selben Thread erstellen und anzeigen. Ich würde dringend empfehlen, dass Sie die gesamte Benutzeroberfläche in einem einzigen Thread ausführen. Bitte beachten Sie die InvokeRequired und Invoke-Mitglieder von Control.

+1

Das ist nicht korrekt. Ein Dialog hat keine eigene Nachrichtenschleife, er verwendet die gleiche Nachrichtenschleife wie das Fenster, aus dem er geöffnet wurde. Es gibt nur einen Thread. – Guffa

+1

Eigentlich ist es richtig: Es hat eine eigene Nachrichtenschleife. Wie sonst würde die ShowDialog-Funktion nicht zurückkehren, bis der Dialog geschlossen wird? Hinweis Ich habe nicht gesagt, dass es eine eigene Nachricht QUEUE hat. Die Nachrichtenwarteschlange ist pro Thread. Dies gilt sogar für Win32-Dialoge: Siehe die DialogBox-Funktion. –

+0

Ich mache das alles im Singlethread. Die Funktion ShowDialog() erstellt ein Formular im selben Thread. Wie behebe ich das? – Hooch

Verwandte Themen