Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Codegewitter

Frischling

  • »Codegewitter« ist der Autor dieses Themas

Beiträge: 6

Wohnort: Österreich

Beruf: Schüler

  • Private Nachricht senden

1

18.01.2012, 10:10

[C#] delegate und backgroundworker

Morgen Jungs,

Wie kann ich Delegate verwenden um beim Benutzen des BackgroundWorkers einen Fehler bei einem threadübergreifenden Vorgang zu verhindern?
Bzw. Wie könnte ich dieses Problem generell lösen?
"Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement pbx_Game erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde."

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private void bgworker_1_DoWork(object sender, DoWorkEventArgs e)
        {
            int xShot, yShot

            xShot = pnl_Player.Location.X + 40; // 40 = Länge des PlayerPanels
            yShot = pnl_Player.Location.Y + 10; // 15 = halbe Höhe des PlayerPanels - 5(halbe Höhe des ShotPanels)

            CreateShot(new Point(xShot, yShot));
}
        
        public void CreateShot(Point Loc)
        {
            Shot.BackgroundImage = Shot1;
            Shot.Size = new Size(30, 10);
            Shot.Location = Loc;
            pbx_Game.Controls.Add(Shot);
        }


MfG

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

2

18.01.2012, 10:36

Operationen welche die UI betreffen müssen auf dem Thread ausgeführt werden welcher die UI managed, ich weiß nicht ob du WPF oder WinForms verwendest, aber in beiden Fällen gibt es sicherlich einen Dispatcher für den UI Thread, diesen musst du benutzen um deine UI gerichteten Aktionen zum UI Thread zu dispatchen:

Quellcode

1
2
3
4
dispatcher.BeginInvoke((Action)(() => 
{
  // UI Code hier
}));


Der Dispatcher ist meist an einem UI Element zu finden (WPF);

Quellcode

1
Form1.Dispatcher.BeginInvoke(...);


Unter WindowsForms dürfte der Zugriff über den Dispatcher nicht notwendig sein, da dort die Controls direkt BeginInvoke anbieten:
http://msdn.microsoft.com/en-us/library/…v=vs.80%29.aspx

Kleiner Tipp: Du erstellst keine Schüsse sondern veränderst nur immer wieder das selbe Element (Shot) und fügst dieses mehrfach in pbx_Game.Controls ein. Ich glaube das ist falsch.

Codegewitter

Frischling

  • »Codegewitter« ist der Autor dieses Themas

Beiträge: 6

Wohnort: Österreich

Beruf: Schüler

  • Private Nachricht senden

3

18.01.2012, 11:06

Danke für die schnelle Antwort :)
Kleiner Tipp: Du erstellst keine Schüsse sondern veränderst nur immer wieder das selbe Element (Shot) und fügst dieses mehrfach in pbx_Game.Controls ein. Ich glaube das ist falsch.
Ich weiß da fehlt noch Einiges :) aber danke trotzdem
MfG

Werbeanzeige