Forum: GUI-Design mit VCL / FireMonkey / Common Controls
Delphi
by alzaimar,
12. Mär 2007
Dein 'StoppBackgroundTask' sollte ein 'ResetEvent' aufrufen und der Thread per 'WaitForSingleObject' prüfen, ob er laufen darf:
Procedure TMyThread.Execute;
Begin
While not Terminated Do
Case WaitForsingleObject (fMyEvent...) Of
WAIT_OBJECT_0 :
ExecuteNextJob;
WAIT_TIMEOUT :
HandleTimeout;
Forum: GUI-Design mit VCL / FireMonkey / Common Controls
Delphi
by alzaimar,
12. Mär 2007
Mit 'offiziell' meine ich die Verwendung von Events und/oder Semaphoren sowie die zugehörigen Synchronisationsaufrufe 'ReleaseSemaphore','Set/ResetEvent', 'WaitForSingleObject' etc.
Das Einzige, was Du vlt. ändern müsstest, ist diese Logik 'Bitte mal kurz stoppen', denn so ein Thread soll ja eigentlich warten (und dabei keine/kaum CPU-Zeit verbraten) bis etwas zu tun ist. Hier wäre es eben...
Forum: GUI-Design mit VCL / FireMonkey / Common Controls
Delphi
by alzaimar,
12. Mär 2007
Ohne das jetzt genau zu analysieren, fehlt -denke ich mal- einfach die richtige Synchronisation. TCriticalSections sind wirklich sehr leichtgewichtig und sperren nur unterschiedliche Threads gegenseitig aus. Ein und der selbe Thread kann so oft er will, ein 'Acquire' aufrufen.
Dessenungeachtet würde ich trotzdem den an sich falschen Code (weil keine 'offiziellen' Synchronisationsmechanismen...
Forum: GUI-Design mit VCL / FireMonkey / Common Controls
Delphi
by alzaimar,
10. Mär 2007
Ich verstehe nicht, wieso Du dir so einen abbrichst:
Ein Workerthread wartet, bis er etwas zu tun bekommt. Wenn Du in schlafen legst, kann er ja nicht mehr warten, da er schläft. :mrgreen:
Verwende eine Semaphore oder ein Event, um dem Thread mitzuteilen, das arbeit auf ihn wartet. Da eine Semaphore in etwa ein threadsicherer Zähler mit Benachrichtigungsmechanismus ist, kannst Du sie auch...