Toon posts:

[Borland c++] Hoe kun je een Thread Object opnieuw starten?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

Ik zou graag een thread (object) die normaal continue blijft draaien willen interupten en opnieuw willen starten, zodat hij bij de execute() code weer bovenaan begint. Via thread->terminate() en dan thread->resume() lukt het niet. Hij gaat dan gewoon verder waar hij gebleven was. Ook de thread opnieuw aanmaken is geen optie want dan ben ik de inhoud van alle variabelen in de thread kwijt. Ik ben opzoek naar een andere oplossing dan een functie te maken die eerst alle variabelen doet backuppen, dan de oude thread opgeeft en een nieuwe aanmaakt en alle variabelen terug kopieert. Ik neem aan dat de thread object wel een mogelijkheid heeft om opnieuw te starten??

Alvast bedankt!

  • whoami
  • Registratie: December 2000
  • Laatst online: 20-02 21:53
Afgezien van je probleem is het zowiezo geen goed idee om een thread te stoppen of te pauseren mbhv de Terminate method, omdat je de Thread dan ongecontroleerd stopt.
Meestal wil je er voor zorgen dat, als je de thread wil stoppen, hij toch nog ff voortdoet met de huidige taak, zodat die op een normale manier kan afgerond worden.

Wat je kan doen, is een class maken die de taak bevat die jij wil uitvoeren op een andere thread.
Die class bevat dan bv een Run method en een Pause en Resume method.
De Run method kan bv checken of een bepaalde vlag op true staat, en pas iets doen als die vlag daadwerkelijk op true staat.
De Pause method zet die vlag dan bv op false, en Resume zet die vlag terug op true.

https://fgheysels.github.io/


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Een TThread heeft een Suspend method om een thread te pauzeren. Met Resume laat je de thread weer verder lopen. Terminate is alleen voor het afsluiten.

We adore chaos because we like to restore order - M.C. Escher


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

whoami schreef op maandag 29 mei 2006 @ 17:09:
Afgezien van je probleem is het zowiezo geen goed idee om een thread te stoppen of te pauseren mbhv de Terminate method, omdat je de Thread dan ongecontroleerd stopt.
Los ervan of het een goede methode is of niet: voor zover ik weet is de TThread.Terminate methode geen harde methode die direct de thread stopzet. In je Execute method heb je een loop à la dit:
C++:
1
while (!Terminated) {

Terminate aanroepen doet niet meer dan Terminated op true zetten. De thread maakt dus netjes zijn loop af en voert daarna eerst de code uit die na de loop volgt, alvorens deze beëindigt.

Verder zou ik de TThread klasse zo extenden dat er in je loop telkens wordt gecheckt of je de thread gesuspend hebt gehad, en zo ja, dan worden de waarden uit je constructor opnieuw ingevuld. Controleren of de thread gesuspend is geweest kun je eenvoudigweg doen door OnSuspend (ik geloof dat die handler bestaat; zo niet, zelf even een MySuspend maken) een boolean op true te zetten. Na het resetten zet je die boolean weer op false.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Okeej bedankt voor de tips alleen mijn probleem is iets anders..

Ik ben bezig met het schrijven van een tokenring protocol. Ik heb een thread gemaakt die de Token Holding Time (THT) bijhoudt. Dus een soort timer. Eerst wordt de wachttijd berekend, dan gaat de thread in slaap mode met Sleep(THT). Als hij hieruit wakker wordt roept hij even een functie aan en gaat weer opnieuw slapen. Het probleem is echter dat als alles goed gaat deze thread nooit uit zijn Sleep mag komen. De thread wordt namelijk voordat de THT tijd is verlopen door een andere thread geterminated en vervolgens opnieuw gestart zodat de THT tijd opnieuw berekend wordt en hij weer de volledige THT tijd in sleep gaat. Ik heb er dus niks aan om in een while loop te controleren of hij opnieuw moet beginnen omdat hij dan eerst uit de sleep moet komen, en dat wil ik juist niet.

Ik ben dus echt opzoek naar een manier om de thread meteen te laten stoppen met waar hij mee bezig was en vervolgens opnieuw te laten starten. Ik heb dat nu zo gedaan maar dat werkt helaas niet: (het thread object heet TRT_Timer)

TRT_Timer * TRTThread;
TRTThread = globals->_TRTThread; // Haal pointer naar thread op uit classe

TRTThread->Terminate(); // beeindig thread onmiddelijk

//.. Create new TRT thread
TRT_Timer * TRTThread_NEW; // maak nieuwe pointer
TRTThread_NEW = new TRT_Timer(true); // creeer nieuwe thread
globals->_TRTThread = TRTThread_NEW; // sla pointer op
TRTThread_NEW->set_globals(globals); // Geef hem zijn oude informatie terug
TRTThread_NEW->Resume(); // start thread

Deze code laat de thread weer verder lopen waar hij geeindigd is. Wat ik heel merkwaardig vindt aangezien TRTThread_NEW en TRTThread totaal verschillende pointers zijn (via debug->inspect). Ik doe iets fout maar ik zie niet wat. Of is er een makkelijkere manier? :?

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Gebruik dan events (Als in win32 events). Block je thread met functies als WaitForSingleObject en wacht totdat iemand anders het event raised met bijvoorbeeld PulseEvent. Je geeft WaitForSingleObject ook een timeout mee en als WaitForSingleObject retouneerd kan je controleren of dat komt door de timeout of door een event. Dit in een heel strak loopje die op Terminated controleerd en je thread is klaar.

We adore chaos because we like to restore order - M.C. Escher


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 10-12-2025
Lijkt me erg overbodig en ingewikkeld. Met SleepEx kun je een Sleep onderbreken door een APC vanuit een andere thread.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
MSalters schreef op maandag 29 mei 2006 @ 20:49:
Lijkt me erg overbodig en ingewikkeld. Met SleepEx kun je een Sleep onderbreken door een APC vanuit een andere thread.
Hoe gebruik ik dat SleepEx ?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

SleepEx intikken, F1. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
In mijn Borland Help staat niks over de functie SleepEx. Ik kan hem wel gebruiken aangezien hij door borland wordt herkend als ik SleepEx intik. Weet iemand hoe ik deze moet gebruiken?

Ik kan wel wat info vinden via google maar geen voorbeelden :|

[ Voor 16% gewijzigd door Verwijderd op 30-05-2006 08:43 ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

SleepEx is een win32 functie van Windows en niet specifiek van Delphi alleen. Je vind de help voor deze functie in msdn (http://msdn.microsoft.com.../dllproc/base/sleepex.asp) of in de WinSDK help die bij je BCB zit.

[ Voor 10% gewijzigd door LordLarry op 30-05-2006 08:50 ]

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
Kan iemand een voorbeeld geven hoe ik SleepEx gebruik in mijn situatie. Ik heb dus een thread object dat met Sleep(THT) een tijd van THT wacht. Nu wil ik vanuit een andere thread deze Sleep tijd opnieuw starten zonder dat hij daarvoor eerst uit de Sleep komt. Want dat zou een extra delay betekenen. Kan iemand mij een voorbeeld geven hoe ik dat met SleepEx voorelkaar krijg? Ik begrijp niet zoveel van de uitleg op MSDN :?

  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
No flame intended, maar als het lezen van de documentatie omtrent SleepEx problemen oplevert, vraag ik me af waarom je met threads in de weer bent. Goed programmeren met threads vereist naar mijn idee meer skills dan het gebruik van SleepEx.

Hier help ik je niet mee, maar ik wilde het even kwijt. Nogmaals: no flame intended.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Het verschil tussen Sleep en SleepEx is dat SleepEx onderbroken kan worden door bijvoorbeeld een APC. Daarvoor moet je wel True meegeven met de 2e parameter. Aan het resultaat van de functie kan je zien of de volledige tijd is afgelopen of het onderbroken is door bijvoorbeeld een APC.

Het idee van MSalters is dat je die eigenschap van SleepEx gebruikt. Als SleepEx onderbroken wordt weet je dat de THT niet verstreken is en dat je opnieuw weer SleepEx kan aanroepen. Iemand anders kan SleepEx onderbreken door bijvoorbeeld een APC te sturen. Dit is hetzelfde idee als ik al als suggestie gaf alleen dan iets anders opgezet.

We adore chaos because we like to restore order - M.C. Escher


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 20-02 21:20
Sta ook even stil bij de resolutie van de genoemde functie.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1