Thread in C++ Builder met TEvent

Pagina: 1
Acties:
  • 133 views sinds 30-01-2008
  • Reageer

  • ADJVooDoo
  • Registratie: Januari 2001
  • Laatst online: 27-06 13:20
Hallo.
Ik ben bezig met een programma in C++ waar ik ook threads in wil gebruiken. Is geen probleem, werkt allemaal goed. Ook het TEvent object werkt goed, alleen je kunt 'm niet tellend maken.
SetEvent() werkt niet optellend. Als je twee SetEvent()s achter elkaar doet, dan wordt de tweede niet onthouden.
Dit wil ik gebruiken voor een cache systeem. De ene thread vult de cache en de andere leest hem uit. Dan is een tellend iets wel makkelijk. Dat de lees thread stopt zosnel er geen SetEvent()s meer zijn gedaan, dus dat de cache leeg is.

Kan iemand mij uit de brand helpen? In Java kan het wel.
Alvast bedankt.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Het kernel-object Event kan niet tellen en is enkel bedoeld als trigger (aan/uit/pulse). Een semaphore, waar VCL overigens geen implementatie van heeft, kan wel tellen maar kun je de huidige tellerstand niet van uitlezen: opzettelijke limitatie van het betreffende kernelobject.

Als je een semaphore wil gebruiken zul je deze zelf moeten encapsuleren via de API: CreateSemaphore.

Jij wil gewoon een teller aanmaken, geen event. Hiervoor maak je gewoon een integer membervariabele aan die je met een TCriticalSection beschermt tegen multithreaded access.

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Eeeps, zie net dat TCriticalSection wel *heel* vies is geimplementeerd. Zoek maar gewoon in de Win32 API naar:
• InitializeCriticalSection
• EnterCriticalSection
• LeaveCriticalSection
• DeleteCriticalSection

En encapsuleer daar zelf iets mee (hint: destructors gebruiken!)

Professionele website nodig?


  • ADJVooDoo
  • Registratie: Januari 2001
  • Laatst online: 27-06 13:20
Wat ik wil is een soort van queue tussen twee threads. Als bijvoorbeeld de thread die uit de queue leest veel langzamer is als de thread die er in schrijft, dan heb ik een teller nodig.
Jammer dat C++ zelf niet zoiets heeft. Java heeft het wel.

Goed, bedankt voor de reacties. Nu weet ik tenminste dat ik niet verder hoef te zoeken en zelf iets moet bedenken.

Is er niet toevallig ergens een Semaphore class in C++ te vinden? Hoef ik zelf niks te maken. :-)

  • ADJVooDoo
  • Registratie: Januari 2001
  • Laatst online: 27-06 13:20
Ik heb al een oplossing bedacht geloof ik.
Ga geen tellent iets gebruiken.
Zosnel er iets in de queue gezet wordt, wordt de Event ook gezet. Zosnel het laatste element uit de queue is gehaald reset ik het element weer in de queue class. Nu hoeft het event object alleen bekent te zijn in de queue class en de lees class. En het event moet zo ingesteld staat dat hij na een waitfot op 1 blijft en pas 0 wordt als er een resetEvent gedaan wordt.
Moet lukken.
Bedankt mensen.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op dinsdag 05 februari 2002 23:09 schreef ADJVooDoo het volgende:
Ik heb al een oplossing bedacht geloof ik.
Ga geen tellent iets gebruiken.
Zosnel er iets in de queue gezet wordt, wordt de Event ook gezet. Zosnel het laatste element uit de queue is gehaald reset ik het element weer in de queue class. Nu hoeft het event object alleen bekent te zijn in de queue class en de lees class. En het event moet zo ingesteld staat dat hij na een waitfot op 1 blijft en pas 0 wordt als er een resetEvent gedaan wordt.
Moet lukken.
Bedankt mensen.
Zul je alsnog via een critical section of mutex die queue moeten beschermen overigens.

Professionele website nodig?

Pagina: 1