AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit Thread in eigener Komponente

Ein Thema von Sascha L · begonnen am 26. Apr 2006 · letzter Beitrag vom 26. Apr 2006
 
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, 07: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:29 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