[C#/Threading] Delen van Bitmap

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Voor een applicatie heb ik een interessant probleem. Het gaat om het gebruik van de gezichtherkenningssoftware Luxand. Deze API haalt netjes een bitmap van de webcam en detecteerd hier zo'n 60 punten op. Deze 60 punten worden daarna door mij op het image zelf getekend. Al deze code staat in een apart thread dat zo snel draait als het kan.

Nu zou ik dit plaatje graag ook tonen in de GUI maar het bitmap object is natuurlijk niet op het GUI thread gemaakt. Luxand maakt per frame een nieuw bitmapje dus ik weet zeker dat het andere thread, na bijvoorbeeld een event, er niets meer mee gaat doen. Maar hoe verplaats ik het bitmapje naar het GUI thread?

Nu begrijp ik na het zien van deze SO vraag dat het bitmap object natuurlijk toegankelijk is via alle threads. Maar Visual Studio waarschuwt me dan netjes voor een CrossThreadException omdat ik iets met het bitmapje probeer te doen terwijl het niet op hetzelfde thread gemaakt is. Normaliter zou ik dan een invoke doen zodat alle methodes op het zelfde thread uitgevoerd worden als waar het object gemaakt is. Maar in dit geval heb ik gewoon de data uit het object nodig en wil ik het niet op een andere manier beïnvloeden

Wie kan mij van adviezen verzien anders dan de CT exception uit zetten?

[ Voor 3% gewijzigd door roy-t op 21-03-2012 14:07 ]

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Maak je gebruik van WPF? Dan kan je dat via de dispatcher regelen. SO

Skill is when luck becomes a habit.


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Hey dat is een goede vondst. Luxand zelf gebruikt niet WPF maar de WinForms API, dus er komt een WFBitmap uit maar die kan ik op het thread zelf wel omzetten naar een WPF Image en dan via de dispatcher heen een weer gooien.

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • Teunis
  • Registratie: December 2001
  • Laatst online: 21:26
Je kan ook eens kijken naar: Reactive Extensions
(video: http://channel9.msdn.com/...11-Netherlands/Devdays014)
of .net 4.5 (async & await)

Please nerf Rock, Paper is fine. Sincerely yours, Scissor.
GW2:Teunis.6427


Acties:
  • 0 Henk 'm!

  • evolution536
  • Registratie: Maart 2009
  • Laatst online: 05-06-2024

evolution536

besh besh

Ik doe dit altijd middels een event. op het moment dat de andere thread een bitmap maakt van een frame vuur je een event af waarin je als parameter de bitmap meegeeft. event zet je aan een functie op je GUI, en in die functie doe je

C#:
1
picturebox1.Invoke(new MethodInvoker(() => { < hier update je de control (picturebox?) met de bitmap>; } ));

Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
evolution536 schreef op donderdag 22 maart 2012 @ 09:06:
Ik doe dit altijd middels een event. op het moment dat de andere thread een bitmap maakt van een frame vuur je een event af waarin je als parameter de bitmap meegeeft. event zet je aan een functie op je GUI, en in die functie doe je

C#:
1
picturebox1.Invoke(new MethodInvoker(() => { < hier update je de control (picturebox?) met de bitmap>; } ));
Het door pasen van het object was het probleem niet, ook invoke staat in mijn TS :). Maar de truuk om een object te freezen was wat ik zocht :).

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • evolution536
  • Registratie: Maart 2009
  • Laatst online: 05-06-2024

evolution536

besh besh

het object freezen doe je middels het "lock" statement. kijk wellicht is bij c# tutorials over volatility en thread locking.

C#:
1
2
3
4
5
6
7
8
lock (bitmapobject)
{
    <voer hier de code uit die de bitmap deelt>
}
// of dit
<code die de bitmap deelt>
lock (bitmapobject);
<nog meer code>


Ook zou je wellicht het object kunnen freezen door het object bitmap volatile te maken.
C#:
1
volatile object bitmap;

Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Hey je bedoelt het vast goed, maar je moet echt even de andere replies door lezen. Het gaat hier niet om volatility en thread locking. En de manier van freezen die we hier bedoelen is gericht op WPF's Freezable.Freeze.

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Kun je niet de image buffer opvragen en die in een nieuwe Bitmap stoppen? Immers krijg je met het sharen van een uint of byte array geen cross thread exceptions.

C#:
1
2
3
4
// buffer = new uint[width * height]; -> komt uit je image face api
GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
IntPtr pointer = Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0);
Bitmap bmp = new Bitmap(width, height, width * 4, PixelFormat.Format32bppArgb, pointer);

[ Voor 10% gewijzigd door PrisonerOfPain op 23-03-2012 13:01 ]

Pagina: 1