Einzelnen Beitrag anzeigen

Sascha L

Registriert seit: 4. Jun 2004
Ort: Hamm
390 Beiträge
 
Delphi 2006 Professional
 
#1

Probleme mit Thread in eigener Komponente

  Alt 26. Apr 2006, 08:56
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
Sascha
  Mit Zitat antworten Zitat