Forms in MDI-Container-Form sollen im eigenen Threads laufen



  • Ich möchte dass Forms, die in einem MDI-Container-Form sind, in ihrem eigenen Thread laufen.

    Ich habe schon Forms in einem MDI Form erstellt. Und auch Forms in eigenen threads starten können. Aber beides zusammen konnte ich noch nicht zum laufen bringen.

    Das Problem ist die übergabe des mdiParent.

    Bei meinem letzten Versuch habe ich aus Form1 heraus einen Thread gestartet und ihm this, also das Form1 Objekt, als Parameter mitgegeben. Dies sollte im Thread dann dem neu erstellten Form2 Objekt als mdiParent übergeben werden. Dabei gibt es jedoch einen Fehler da er aus dem Thread versucht auf das Form1 Objekt zuzugreifen.

    Hier mal ein bisschen source der relevanten Stellen in Form1. Dabei soll Form2 in den mdi-container Form1 und im eigenen Thread laufen.

    static void startThreadForm2( Object^ theMdiParent )
    		{
    			Form2^	form2obj = gcnew Form2;
    			form2obj->MdiParent = (System::Windows::Forms::Form^)theMdiParent;
    
    			Application::Run( form2obj );
    		};
    

    ... und weiter unten der Aufruf...

    //Thread starten und ihm dieses Form1 Objekt mitgeben damit
    				//das Form2 Objekt Form1 als mdiParent setzen kann.
    				Thread^ oThread1 = gcnew Thread( gcnew ParameterizedThreadStart( &startThreadForm2 ) );
    				oThread1->Start( this );
    

    Oder kann es sein, dass das was ich hier versuche garnicht möglich ist. 😕



  • Dabei gibt es jedoch einen Fehler da er aus dem Thread versucht auf das Form1 Objekt zuzugreifen.

    Was für einen?

    Ich denke, es ist nicht möglich eine Parent - Child Beziehung von Controls zu haben, die von unterschiedlichen Threads erzeugt worden sind.

    Simon



  • Es gibt folgenden Fehler sobalt der Teil mit der Zuweiseung von mdiParent aufgerufen wird.

    System.InvalidOperationException wurde nicht behandelt.
    Message="Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement Form1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde."
    Source="System.Windows.Forms"
    StackTrace:
    bei System.Windows.Forms.Control.get_Handle()
    bei System.Windows.Forms.Control.get_CreateThreadId()
    bei System.Windows.Forms.Form.set_MdiParentInternal(Form value)
    bei System.Windows.Forms.Form.set_MdiParent(Form value)
    bei test310.Form1.startThreadForm2(Object theMdiParent) in c:\develop\test310\test310\form1.h:Zeile 59.
    bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    bei System.Threading.ThreadHelper.ThreadStart(Object obj)
    InnerException:

    Ist es eventuell möglich das Objekt im main Thread zu erzeugen und dann in einen eigenen thread zu schleifen?



  • Ist es eventuell möglich das Objekt im main Thread zu erzeugen und dann in einen eigenen thread zu schleifen?

    Nein.

    Warum besteht denn das Bedürfnis, das Child in einem anderen Thread laufen zu lassen?

    Ev. hilft ein anderer Ansatz: Lagere die Arbeit auf einen Thread aus (z.B. mit Background- Worker).

    Ist IMO die üblichere Variante.
    Simon



  • Man kann ja mal Probieren. .

    Dein Vorschlag währe dann meine zweite Lösungsvariante gewesen.

    Wobei ich momentan AsyncMethodCaller mit Callback im Auge habe.
    Kenne micht mit den ganzen .Net Möglichkeiten noch nicht so gut aus.


Anmelden zum Antworten