Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by shmia,
15. Mai 2012
Ich habe den Konstruktor jetzt so geändert:
constructor TSleepingThread.Create(CreateSuspended: Boolean);
begin
inherited Create(True);
FEvent := TSimpleEvent.Create;
if not CreateSuspended then
Resume;
end;
Ausserdem gibt es noch einen 2. Thread in dem Demo um es einfache Datenübergabe zu zeigen.
Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by shmia,
14. Mai 2012
Für Delphi 5 scheint das aber nicht zu stimmen:
constructor TThread.Create(CreateSuspended: Boolean);
var
Flags: DWORD;
begin
inherited Create;
AddThread;
FSuspended := CreateSuspended;
Flags := 0;
if CreateSuspended then Flags := CREATE_SUSPENDED;
Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by shmia,
11. Mai 2012
Leider doch:
destructor TThread.Destroy;
begin
if not FFinished and not Suspended then
begin
Terminate; // <===
WaitFor;
end;
if FHandle <> 0 then CloseHandle(FHandle);
inherited Destroy;
Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by shmia,
11. Mai 2012
Ich hatte da schon so ein Bauchgefühl, dass das nicht so ganz passt.
Bei Delphi 5 ist Terminate nicht virtuell und kann daher nicht überschrieben, sondern nur verdeckt werden.
Deshalb lass ich den Thread jede Sekunde einmal aufwachen, damit er prüfen kann ob er terminiert wurde.
Falls Terminate in neueren Delphi Versionen virtuell ist, könnte man natürlich per bedingter Compilierung deinen...
Forum: Neuen Beitrag zur Code-Library hinzufügen
Delphi
by shmia,
11. Mai 2012
Die Klasse TSleepingThread ist ein besonders fauler Geselle. 8-)
Der Thread arbeitet nur, wenn man ihn von Aussen gezielt aufweckt.
Sobald er seine Arbeit getan hat (procedure DoWork;) legt er sich wieder schlafen.
Ob der Thread gerade am arbeiten ist lässt sich über das Propery Busy abfragen.
TSleepingThread = class(TThread)
private
FEvent : TSimpleEvent;
FBusy : Boolean;
protected
...