C# Thread / Involke

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

      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:

      Quellcode

      1. private delegate void SetPanelControllAdd(Panel pa);
      2. private void SetPanelControllAdd(Panel pa){
      3. // Invoke nötig?
      4. if (pa.InvokeRequired)
      5. {
      6. // Invoke nötig
      7. pa.Invoke(new SetPanelControllAdd(pa));
      8. }
      9. else
      10. {
      11. // Kein Invoke nötig - Vorgang sicher durchführbar
      12. SplitContailer.Panel2.Controls.Add(pa);
      13. }
      14. }
      15. private void createFrame(){
      16. pa = new Panel[cf.breite, cf.höhe];
      17. int x = 0;
      18. int y = 0;
      19. for (int i = 0; i < cf.breite; i++)
      20. {
      21. for (int a = 0; a < cf.höhe; a++)
      22. {
      23. pa[i, a] = new Panel();
      24. pa[i, a].Visible = true;
      25. pa[i, a].BackColor = Color.Black;
      26. pa[i, a].Width = 40;
      27. pa[i, a].Height = 40;
      28. pa[i, a].Location = new Point(x, y);
      29. pa[i, a].BorderStyle = BorderStyle.FixedSingle;
      30. pa[i, a].MouseHover += new EventHandler(Panels_Hover);
      31. pa[i, a].Click += new EventHandler(Panels_Click);
      32. //SplitContailer.Panel2.Controls.Add(pa[i, a]); Hier der Fehler mit dem Threadübegreifenden
      33. SetPanelControllAdd(pa[i, a]); //Hier der 2te Fehler
      34. x += 40;
      35. }
      36. y += 40;
      37. x = 0;
      38. }
      39. }
      Alles anzeigen



      MfG Waschi ^^
      Das Leben ist scheiße, hat aber ne hamma Grafik^.^
      :D :D
      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).

      Quellcode

      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 ....

      Quellcode

      1. // Invoke nötig?
      2. if (pa.InvokeRequired)
      3. {
      4. // Invoke nötig
      5. pa.Invoke(new SetPanelControlAddCallback(SetPanelControlAdd), pa);
      6. }
      7. else
      8. {
      9. // Kein Invoke nötig - Vorgang sicher durchführbar
      10. SplitContailer.Panel2.Controls.Add(pa);
      11. }
      Alles anzeigen

      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
      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

      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.

      Quellcode

      1. private void SetPanelControlAdd(Panel pa)
      2. {
      3. // Invoke nötig?
      4. if (SplitContailer.Panel2.InvokeRequired)
      5. {
      6. // Invoke nötig
      7. SplitContailer.Panel2.Invoke(new Action(
      8. delegate
      9. {
      10. SplitContailer.Panel2.Controls.Add(pa);
      11. }));
      12. }
      13. else
      14. {
      15. // Kein Invoke nötig - Vorgang sicher durchführbar
      16. SplitContailer.Panel2.Controls.Add(pa);
      17. }
      18. }
      Alles anzeigen


      Danke für die ganze Hilfe hier ;)
      Das Leben ist scheiße, hat aber ne hamma Grafik^.^
      :D :D