C# Thread / Involke

  • Hey, ich habe ein Problem mit einen threadübergreifenden Vorgang.
    Ich möchte ein Panel hinzufügen. Das mache ich mit SplitContailer.Panel2.Controls.Add(pa[i, a]); //pa ist ein Array aus Panels
    Klappt super, jetzt möchte ich es bisschen smoother gestanden und es mit Threads umsetzten.
    Er sagt mir "Ungültiger threadübergreifender Vorgang", deswegen habe ich versucht es mit dem Snippet von florian0 zu umgehen (LINK)
    Jetzt bekomme ich den Fehler: MainForm enthält bereits eine Definition für SetPanelControllAdd...
    Vielleicht könnt ihr mir weiterhelfen ;)


    Code:



    MfG Waschi ^^

  • Ich kläre einfach mal auf was der Fehler gewesen wäre, keine Ahnung wie Ihr das nun gelöst habt ...


    Man definiert einen Delegat, also einen Funktionsprototypen mit Parameterliste. Wie der heißt, ist egal. Er sollte nur nicht so heißen, wie die Funktion, die man aufrufen möchte (was du getan hast).

    Code
    1. private delegate void SetPanelControlAddCallback(Panel pa);
    2. private void SetPanelControlAdd(Panel pa){
    3. // ...
    4. }


    Das wäre erstmal der Basis-Code.


    Im Endeffekt war mein Snippet auch falsch, dass das bisher niemandem aufgefallen ist ...
    Man ruft eigentlich new DelegateName(Funktionsname) auf. Und nicht newDelegatName(ParameterDerFunktion). Ich habe da wohl 2 Lösungsansätze gemischt ....



    Das wärs prinzipell gewesen. Allerdings willst du ja sicher auf SplitContailer.Panel2 zugreifen. Und nicht auf dein Panel pa.
    Daher solltest du eher InvokeRequired und Invoke von SplitContailer.Panel2 verwenden, statt von pa.


    Gruß
    florian0

  • Zitat

    Man definiert einen Delegat, also einen Funktionsprototypen mit Parameterliste. Wie der heißt, ist egal. Er sollte nur nicht so heißen, wie die Funktion, die man aufrufen möchte (was du getan hast).


    Das ist mir im Nachhinein auch eingefallen xD


    Zitat

    Das wärs prinzipell gewesen. Allerdings willst du ja sicher auf SplitContailer.Panel2 zugreifen. Und nicht auf dein Panel pa.
    Daher solltest du eher InvokeRequired und Invoke von SplitContailer.Panel2 verwenden, statt von pa.


    Ja da war ich selber wohl gerade Brainafk xD


    Euphi hat das ganze so gelöst:
    Das Delegat fällt oben werg.


    Danke für die ganze Hilfe hier ;)