![]() |
TThread: Ein paar Fragen zum Umgang damit...
Hi @ll,
ich bastel gerade einen EventThread (zumindest, solange mir jetzt niemand sagt, dass Delphi sowas schon mitliefert ^^). Was stelle ich mir darunter vor? Ich stelle mir das so vor, dass der EventThread eine Liste von Events hat, die zu einem bestimmten Zeitpunkt ausgelöst werden sollen:
Delphi-Quellcode:
Diese Events halte ich in eine TObjectList (FEvents) fest:
TEventThreadNotifier =procedure of object;
TEventThreadEvent =class public exectime: TDateTime; command: TEventThreadNotifier; end;
Delphi-Quellcode:
Die Execute-procedure und Add-procedure vielen mir eigentlich recht leicht:
TEventThread =class(TThread)
private FEvents: TObjectList; public constructor Create; destructor Destroy; procedure Remove(item: TEventThreadNotifier); procedure Add(const AExectime: TDateTime; const cmd: TEventThreadNotifier); procedure Execute; end;
Delphi-Quellcode:
Oder auch nicht...? Kann es passieren, dass ich ein event vor das 0-te Element einfüge und dann beim löschen dieses Element lösche statt dem, dass ich gerade ausgeführt habe? Wie verhindere ich das am besten?
procedure TEventThread.Add(const AExectime: TDateTime; const cmd: TEventThreadNotifier);
var neu: TEventThreadEvent; i: integer; begin Suspend; neu :=TEventThreadEvent.Create; neu.exectime :=AExectime; neu.command :=cmd; for i:=0 to FEvents.Count -1 do begin if TEventThreadEvent(FEvents[i]).exectime > AExectime then begin FEvents.Insert(i, neu); exit; end; end; FEvents.Add(neu); Resume; end; procedure TEventThread.Execute; var nextEvent: TEventThreadEvent; diff: Integer; begin while not Terminated do begin if FEvents.Count = 0 then sleep(5000) else begin nextEvent :=TEventThreadEvent(FEvents.Items[0]); diff :=MilliSecondsBetween(now,nextEvent.exectime); if diff <=10 then begin synchronize(nextEvent.command); FEvents.Delete(0); end; if diff <=5000 then sleep(diff) else sleep(5000); end; end; end; Und dann noch die Remove-procedure: Von der Theorie her ja einfach:
Delphi-Quellcode:
Aber da sehe ich auch schon wieder unschöne Effekte: Wenn ich mir das Objekt in der Execute-procedure schon geziogen habe und es dann lösche (TObjectList Freed es ja auch), dann kann ich so an schöne AVs kommen.
procedure TEventThread.Remove(item: TEventThreadNotifier);
begin FEvents.Remove(item); end; Wie verhindere ich solche Probleme geschickt? |
Re: TThread: Ein paar Fragen zum Umgang damit...
TThreadList statt TObjectList verwenden :wink:
mr2 |
Re: TThread: Ein paar Fragen zum Umgang damit...
Zitat:
Aber eine Frage dazu habe ich noch: Wenn ich probiere auf dioe LockList zuzugreifen und dann versuche ich gleichzietig von einem anderen Thread aus auf die LockList zuzugreifen, was natürlich nicht geht. Was passiert dann? Warted der Thread solange, bis die LockList wieder ge-Unlock-ed wird? |
Re: TThread: Ein paar Fragen zum Umgang damit...
genau so ist das :)
TThreadList verwendet intern einen kritischen Abschnitt (TRtlCriticalSection) dadurch stellt das Betriebsystem sicher, dass sich nur ein Thread gleichzeitig in diesem Abschnitt befindet, ein zweiter Thread wird solange blockiert bis der erste den Abschnitt wieder verlassen hat mr2 P.S.: Wenn Du zwei kritische Abschnitte (oder ThreadListen) hast, kannst Du damit prima einen Deadlock verursachen, dann wartet A auf B und B auf A :lol: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz