Hallo,
ich habe eine eigene Komponente entwickelt, die auch einwandfrei funktioniert. Leider darf ich den Code nicht veröffentlichen, aber das spielt auch keine Rolle, da die Komponente ja fehlerfrei funktioniert.
Mithilfe eines Timers wurde jede Millisekunde eine Prozedur aufgerufen. Bei verschiedenenen Tests auf unterschiedlichen PCs viel auf, dass das ganze nicht immer performant ist, da es sein kann, dass die Prozedur länger als 1ms brauch und das hat ja zur Folge, dass alles Andere hinten dran in eine Warteschlange gesetzt wird und dann schnellt die CPU-Auslastung nach oben.
Also habe ich nun alles so umgebaut, dass ich einen Thread verwende.
Hier mal ein kleiner Auszug:
Delphi-Quellcode:
type
TDrawThread = class(TThread)
private
fOwner: TObject;
protected
procedure Execute; override;
procedure Delay(msec: Longint);
public
constructor Create(AOwner: TObject);
end;
TTicker = class(TGraphicControl)
private
fDrawThread: TDrawThread;
[...]
constructor TDrawThread.Create(AOwner: TObject);
begin
fOwner := AOwner;
inherited Create(true);
end;
procedure TDrawThread.Execute;
begin
while not Terminated do begin
with (fOwner as TTicker) do begin
fTick := fTick + 1;
if fTick > 10000 then fTick := 0;
DrawEntries;
end;
Delay(1);
//Sleep(1);
end;
end;
procedure TDrawThread.Delay(msec: Longint);
var
start, stop: Longint;
begin
start := GetTickCount;
repeat
stop := GetTickCount;
until (stop - start) >= msec;
end;
constructor TTicker.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
fDrawThread := TDrawThread.Create(self);
[...]
end;
Nun meine zwei Probleme:
1.) Ich habe ja vorher einen Timer mit dem Intervall von einer Millisekunde verwendet. Ich habe hier nun sowohl mit Sleep(1) als auch mit Delay(1) gearbeitet, aber in beiden Fällen liegt die CPU-Auslastung bei 100% (!). Beim Timer lag sie weit unter 10%.
2.) Ich bekomme ständig vom Compiler die Fehlermeldung "Thread Error:
Handle ist ungültig(6)", danach funktioniert nichts mehr. Ich kann dann gleich Delphi beenden, da nur noch AVs kommen, wenn ich irgendwas mache (Speichern, erneutes Kompilieren, etc.).
Gruß
Sascha