myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: Windows-Forms » MdiFenster mit unterschiedlichen Threads
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

MdiFenster mit unterschiedlichen Threads

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
DerSchreiberling
myCSharp.de-Mitglied

Dabei seit: 14.05.2008
Beiträge: 5


DerSchreiberling ist offline

MdiFenster mit unterschiedlichen Threads

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Liebe C# Gemeinde,

ich muss folgendes realisieren:
Ein Mdi-Container soll auf Buttondruck neue Threads starten, diese Threads sollen neue Fenster erstellen und darstellen (das ganze hat den Hintergrund das die Applikation für Multicores optimiert werden soll).
Nun mache ich neue Threads die daraufhin eine Form erstellen. Leider funktioniert das nicht weil das Mdi-Parent nicht in einem anderen Thread liegen darf.
Soweit jedenfalls meine Nachforschungen. Aber wie kann ich das dan realisieren? (Mdi-Childs die mit eigenen Fensterthreads dargestellt werden...)

Hier noch der relevante Code:

C#-Code:
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        CheckForIllegalCrossThreadCalls = false;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Thread NeuerThread = new Thread(new ParameterizedThreadStart(Form1.FensterErzeugen));
        NeuerThread.Start(this);
    }

    public static void FensterErzeugen(object mdiParent)
    {
        Form2 frm = new Form2();
        frm.MdiParent = (Form)mdiParent; //hier kommt eine Fehlermeldung
        frm.Show();
    }
}

Ich danke jetzt schon jedem Helfer!
Gruss DerSchreiberling
14.05.2008 21:25 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.483
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo DerSchreiberling,

es stimmt, alle MdiFenster müssen in demselben Thread laufen.

Ist aber kein Problem. Du musst ja nur die eigentlichen rechenaufwändigen Teile in extra Threads verlagern. Siehe dazu  [FAQ] Warum blockiert mein GUI?


herbivore
14.05.2008 21:37 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
michlG michlG ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2909.png


Dabei seit: 26.07.2007
Beiträge: 3.430
Entwicklungsumgebung: VS 2010 PRO
Herkunft: Naturns - Südtirol - Italien


michlG ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi,

Und Herzlich Willkommen bei MyCsharp.de

Zitat:
Nun mache ich neue Threads die daraufhin eine Form erstellen. Leider funktioniert das nicht weil das Mdi-Parent nicht in einem anderen Thread liegen darf.

Eine Grundregel ist, dass man die gesamte GUI immer auf einen Thread lassen soll.
Das heisst: Kein Fenster oder Control mit anderen Threads erstellen.

Deshalb würde ich dir von diesem Vorhaben abraten.
Wenn du es für Multicore optimieren willst, dann kannst du ja die Berechnungen usw. auf mehrere Threads verteilen, aber die Gui würde ich auf einem Thread belassen.

Siehe dazu:  [FAQ] Warum blockiert mein GUI?

mfg
michlG

//EDIT: Hebivore war wieder einmal schneller Daumen hoch
14.05.2008 21:39 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Lars Schmitt Lars Schmitt ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2240.jpg


Dabei seit: 11.10.2005
Beiträge: 2.223
Entwicklungsumgebung: Visual Studio 2013
Herkunft: Witten


Lars Schmitt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo derSchreiberling und Herzlich Willkommen,

Also um eine Anwendung für Multicores zu Optimieren packt man keine Gui Elemente in ein eigenen Thread sondern nur den machmal langläufigen Backend Code

mfg
14.05.2008 21:44 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MOGNew
myCSharp.de-Mitglied

Dabei seit: 07.02.2008
Beiträge: 47


MOGNew ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo DerSchreiberling,

ich habe mich vor kurzem auch mit dem Thema auseinander gesetzt und nicht wirklich verstanden was die Jungs hier meinen.

Wenn man aber den von herbivore genannten link folgt und sich zu diesem Thema die Webcasts von Bernd Marquardt ansieht bekommt man ein gefühl für MultiThreading.

Gruß

MOGnew
14.05.2008 21:48 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
DerSchreiberling
myCSharp.de-Mitglied

Dabei seit: 14.05.2008
Beiträge: 5

Themenstarter Thema begonnen von DerSchreiberling

DerSchreiberling ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ihr seid ja ein echt tolles Forum. Soviele Antworten smile

ich bin nämlich Student in einem Ferienjob.
Die Aufgabe war es nun mehrere Fenster parallel neuzeichnen zu lassen.
Habe gemeint das geht nicht, weil ich beim googeln gelesen habe das alle im gleichen Thread laufen müssen. Mein Chef meinte das gehen muss...

Also wenn ich euch recht verstehe gibt es keine Möglichkeit das sich die Fenster gleichzeitig neuzeichnen, oder!?

Danke Leute!!! Sich als Praktikant durchzusetzen ist nicht so einfach Augenzwinkern
15.05.2008 00:08 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MOGNew
myCSharp.de-Mitglied

Dabei seit: 07.02.2008
Beiträge: 47


MOGNew ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo DerSchreiberling,

ich bin mir nicht sicher, aber ich denke diese Aussage macht keinen Sinn.
Das erzeugen mehrerer Forms dauert nicht lange. Viel wichtiger ist es, dass die Methoden welche extrem lange brauchen, in Threads ausgelagert werden.

Wenn diese Methoden dann wiederum auf das UI zugreifen, muss wie Bernd Marquardt sagt, "Die goldene Regel" beachtet werden.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von MOGNew am 15.05.2008 00:38.

15.05.2008 00:38 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.483
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo MOGNew,

Zitat:
Mein Chef meinte das gehen muss...

da hat er unrecht. Zumindest bei MDI.

Vielleicht hat er es mal unter .NET 1.1 zum Laufen bekommen, das kann sein, aber falsch wäre es auch da schon gewesen.

Aber noch mal: es ist ja auch gar nicht nötig. Also häng dich nicht daran auf. Wichtig ist., dass die rechenintensiven Operationen in unterschiedlichen Thread laufen.

herbivore
15.05.2008 00:48 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
DerSchreiberling
myCSharp.de-Mitglied

Dabei seit: 14.05.2008
Beiträge: 5

Themenstarter Thema begonnen von DerSchreiberling

DerSchreiberling ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

ich habe jetzt eine Lösung gefunden mit der mehrere (Zeichen)Threads und Mdi-Anwendung zusammen funktionieren verwundert :

1. das Mdi erzeugt das childform und weisst das MdiParent zu.
2. das Mdi erzeugt einen neuen Thread dem das childform übergeben wird.
3. der Thread ruft Application.Run(childform) auf.

Funktionieren tuts jedenfalls problemlos.
Irgendwelche Einwände?

und schon habe ich eine neue Aufgabe:
die Childforms sollen sich ausdocken können und wieder eindocken können. Ausdocken ist kein problem (MdiParent = null). Aber beim eindocken hängts. Schließlich muss bei der MdiParent zuweisung beides in einem Thread sein...

Habe also folgenden Plan ausgetüfftelt:
1. Das Childform sagt seinem Parent das es gleich sterben wird. Der Parent startet einen Thread der als Parameter den Form und den Thread in dem der Form läuft bekommt. Dieser Thread überwacht den Thread des Kindes.
2. Das Kind beendet seinen Thread mittels Application.ExitThread.
3. Der Überwachungsthread reagiert auf Threadende. Er setzt das MdiParent neu (dar beides in einem Thread ist) und startet für das Child wieder einen eigenen Thread der wiederrum Application.Run aufruft.

Sollte doch eigentlich klappen, oder? Tut es aber nicht. Der Überwachungsthread wartet braf bis der Childthread beendet ist. Komischerweise bricht der Überwachungsthread dan einfach zwischen folgenden Zeilen ab (ohne Fehlermeldung oder sonst irgendeiner Reaktion):

C#-Code:
Thread NeuerThread = new Thread(new ParameterizedThreadStart(MDIParent1.CreateThread));
NeuerThread.Start(toReanimateForm);

C# ist schon eine Sache für sich. Aber der GarbageCollector hat mich überzeugt Augenzwinkern

Gruß DerSchreiberling
16.05.2008 12:13 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.483
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo DerSchreiberling,

Zitat:
Irgendwelche Einwände?

ja, es wundert mich, dass das funktioniert. Zumindest hat es nicht den gewünschten Effekt. Auch wenn das Application.Run in dem anderen Thread läuft, bekommt das Fenster seine Nachrichten nicht von dort. Ein Fenster bekommt seine Nachrichten immer aus dem Thread aus dem es erzeugt wurde.

Alle Mdi-Fenster *müssen* in einem Thread laufen. Alles andere macht früher oder später Problem.

Insofern entfällt dein weitergehende Frage, weil sie ja auf der Annahme basiert, dass mehrere Threads verwendet werden.

herbivore
16.05.2008 12:56 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Andreas.May Andreas.May ist männlich
myCSharp.de-Mitglied

avatar-2474.gif


Dabei seit: 07.09.2006
Beiträge: 915


Andreas.May ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hrm, nur so ne Frage? - Wenn dein Cheff meint das du dass so machen musst. Was ist dann das Ziel - sollen die MDI Fenster später aus dem MDIParent herausgezogen werden können um sie auf ein anderes Programm drauf zu setzen? Denn nur dann würde ich den Sinn dahinter erkennen, da SetParent für diesen Vorgang alleinig nicht ausreichen würde und du wirklich eigene GUI Threads benötigst.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Andreas.May am 16.05.2008 13:05.

16.05.2008 13:01 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
DerSchreiberling
myCSharp.de-Mitglied

Dabei seit: 14.05.2008
Beiträge: 5

Themenstarter Thema begonnen von DerSchreiberling

DerSchreiberling ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

das ganze ist nur als Usability-Feature gedacht. So kann man das Hauptfenster minimieren und das andere Fenster trotzdem weiterverwenden oder es zB. auf einen anderen Bildschirm rüberschieben.
17.05.2008 17:17 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.483
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo DerSchreiberling,

dazu müssen die Fenster nicht in unterschiedlichen Threads laufen. Es sollte reichen, MdiParent auf null zu setzen.

Alle Mdi-Fenster *müssen* in *einem* Thread laufen. Alles andere macht früher oder später Problem.

herbivore
18.05.2008 08:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
DerSchreiberling
myCSharp.de-Mitglied

Dabei seit: 14.05.2008
Beiträge: 5

Themenstarter Thema begonnen von DerSchreiberling

DerSchreiberling ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

das mit dem ein und aushängen des Mdi Fensterst hat auch nichts mit den mehreren Threads zu tun.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von DerSchreiberling am 20.05.2008 10:10.

20.05.2008 09:42 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 12 Jahre.
Der letzte Beitrag ist älter als 12 Jahre.
Antwort erstellen


© Copyright 2003-2021 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 18.01.2021 18:48