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
Antwort Antwort
Seite 1 von 2  1 2      
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
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Probleme mit Thread in eigener Komponente

  Alt 26. Apr 2006, 09:11
Zitat von Sascha L:
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.).
Zeichnet die DrawEntries-Methode etwas in GUI-Controls? Falls ja hast Du auch den Hinweis gelesen das VCL-Controls nur synchronisiert angesprochen werden dürfen da die VCL-Controls nicht Thread-Save sind?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Sascha L

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

Re: Probleme mit Thread in eigener Komponente

  Alt 26. Apr 2006, 09:15
DrawEntries zeichnet auf sich selber. Also auf dem Canvas vom Ticker, welcher ja von TGraphicControl kommt.

Aber auch wenn ich Synchronize verwende, bleibt der Fehler bestehen.

Ich habe festgestellt, dass das Problem beim Beenden auftritt. Beim Destroy des Tickers führe ich Terminate aus und dann gebe ich das fDrawThread frei. Was merkwürdig ist: Wenn hier ein Fehler liegt und dadurch mein Programm abschmiert, ist das ja noch ok, aber selbst wenn das Programm dann beendet ist, funktioniert Delphi nicht mehr, weil überall diese Handle-Fehlermeldungen kommen und ständig AVs bzgl. der rtl10.bpl (oder so ähnlich).
Sascha
  Mit Zitat antworten Zitat
Grendel
(Gast)

n/a Beiträge
 
#4

Re: Probleme mit Thread in eigener Komponente

  Alt 26. Apr 2006, 09:28
Zitat von Sascha L:
Ich habe festgestellt, dass das Problem beim Beenden auftritt. Beim Destroy des Tickers führe ich Terminate aus und dann gebe ich das fDrawThread frei.
Und Du wartest auch sauber auf das Ende des Threads? Zeig am besten mal den Codeabschnitt, der den Thread beendet.

Bis neulich ...
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Probleme mit Thread in eigener Komponente

  Alt 26. Apr 2006, 09:41
Wenn Du den Thread selbst freigeben möchtest, solltest Du die Eigenschaft von TThread "FreeOnTerminate" auf false setzen.
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#6

Re: Probleme mit Thread in eigener Komponente

  Alt 26. Apr 2006, 10:01
Zitat von Sascha L:
DrawEntries zeichnet auf sich selber. Also auf dem Canvas vom Ticker, welcher ja von TGraphicControl kommt.
Das ist Unsinn. Ticker liegt auf einer Form und wird daher vom Hauptthread gehandhabt. Das Malen vom Thread aus *muss* synchronisiert werden.
Ein Sleep(1) = 1 Millisekunde ist wohl kaum als grosse Verzoegerung zu betrachten. Du malst also mit voller Kraft dauernd die Control neu.
Delay ist noch schlimmer, da es die Zeitscheibe des Threads garnicht freigibt.
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#7

Re: Probleme mit Thread in eigener Komponente

  Alt 26. Apr 2006, 10:35
Das Problem ist erstmal, dass der Timer nur auf 50ms oder so genau ist, heisst selbst wenn du den Timer auf 1ms stellst und die Verarbeitung dort weniger als 1ms dauert, wird er niemals 1000mal pro Sekunde anschlagen, von daher erklärt sich auch, warum die CPU Auslastung mit dem Sleep bei 100% liegt, da er dort nun tatsächlich wesentlich öfter die Operationen ausführt. Mit dem Timer macht er es bei weitem nicht so oft.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Sascha L

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

Re: Probleme mit Thread in eigener Komponente

  Alt 26. Apr 2006, 10:37
Das Problem mit den AVs habe ich gelöst. War ein ziemlich dämlicher Fehler von mir

Das hier geht ja logischerweise nicht:
Delphi-Quellcode:
Thread := Thread.Create(true);
Thread.FreeOnTerminate := true;

Thread.Terminate;
Thread.Free; // <---
@Robert: Wie mach ich das dann am besten, dass er eine Millisekunde wartet und erst dann die Schleife wieder ausführt?
Sascha
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#9

Re: Probleme mit Thread in eigener Komponente

  Alt 26. Apr 2006, 11:20
Eine Millisekunde ist viel zu kurz.
Schildere doch erst einmal was du machen willst.
  Mit Zitat antworten Zitat
Sascha L

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

Re: Probleme mit Thread in eigener Komponente

  Alt 26. Apr 2006, 11:31
Es wird ein Text horizontal gescrollt. Eben ein Ticker, so wie bei N24, etc. Der soll aber nun flüssig gescrollt werden, also muss die Berechnung sehr häufig aufgerufen werden.

Mit Sleep(10) sieht das ganze schon gut aus und sieht optisch genauso aus, wie beim Timer mit einem Intervall von 1.
Sascha
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 19:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz