Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Timer wird zu langsam (https://www.delphipraxis.net/109603-timer-wird-zu-langsam.html)

Larsi 4. Mär 2008 12:23


Timer wird zu langsam
 
Hi,
ich habe einen Timer der eine Grafik bewegen soll, das funktioniert ja auch schon ganz gut! Aber wenn ich jetzt gleichzeitig eine andere Speicherfressende Sachen wie zb das suchen nach dateien in Delphi oder das löschen von mehreren Dateien bleibt der Timer einfach stehn! Ich habe mal was von IdProcessMessage oder irgendwie sowas gehört, hat das was damit zu tun, also ich will der der Timer weiterlüft. Und mit Threads kenn ich mich leider auch nicht besonders aus also wäre es gut wenn mit jemand mein Problem einfach lösen kann. Wäre sehr dankbar :)

Habe auch schon das Tutorial von dsdt oder wie das heißt über Threads falls die damit überhaupt was zu tun haben gelesen aber irgnedwie sieht das nach sehr viel Arbeit aus. Gehts nicht einfacherer?

MFG Lars Wiltfang

sirius 4. Mär 2008 12:25

Re: Timer wird zu langsam
 
Threads sind ganz einfach. :gruebel:
Und du hast den richtigen (und einzigen) Lösungsansatz gefunden.

Wo klemmt es denn?

Bernhard Geyer 4. Mär 2008 12:28

Re: Timer wird zu langsam
 
VCL-Anwendungen sind alles andere als geeigent für Echzeit-GUI-Aktionen. Hierfür arbeitest Du dich am besten auch in das Thema DirectX ein.

Larsi 4. Mär 2008 12:56

Re: Timer wird zu langsam
 
Es geht mir grunsätzlich darum dass der Timer zu langsam ist jetzt nicht nur bei Grafik Sachen. Also mein Problem ist dass ich nicht weiß wie ich das machen soll mit dem Thread. Wenn mit jemand mal den Code dafür geben könnte wie ein Timer besser arbeitet wäre ich diesem wirklich sehr sehr sehr dankbar da ich schon sehr lange nach einer Lösung suche aber irgendwie hab ich das alles nciht kapiert! :)

Klaus01 4. Mär 2008 13:07

Re: Timer wird zu langsam
 
Hallo Lars,

was ist denn Dein Problem?
Ist es, dass die Aufgaben nicht in einem Timerintervall erledigt werden können?
Oder ist Dir das kleinste Interval (20ms) zu groß?
Wenn es das zweite Problem sein sollte, kannst Du dir mal den MultimediaTimer anschauen.
Wenn es das erste Problem sein sollte -> Threads einsetzen oder das design ändern.

Grüße
Klaus

sirius 4. Mär 2008 13:09

Re: Timer wird zu langsam
 
Es geht bei Threads nicht um den Timer. Es geht bei Threads darum, dass du solche Sachen:
Zitat:

zb das suchen nach dateien in Delphi oder das löschen von mehreren Dateien
in einen Thread auslagerst und dadurch allea was GUI betrifft ohne Probleme läuft.

Dazu nimmst du am einfachsten eine Ableitung der Klasse TThread. Im constructor übergibst du Initialisierungsparameter und im Ereignis onTerminate liest du das Ergebnis aus.
Wichtig ist, dass du dazwischen keine Variablen/Objekte aus dem anderen Thread/MainThread benutzt. Ansonsten musst du mit Synchronisieren anfangen.

Bernhard Geyer 4. Mär 2008 13:12

Re: Timer wird zu langsam
 
Zitat:

Zitat von Larsi
Es geht mir grunsätzlich darum dass der Timer zu langsam ist jetzt nicht nur bei Grafik Sachen.

TTimer setzt auf den simplen Timer von Windows auf und der schlägt maximal 20/50 mal pro Sekunde zu. Alternative währen hier sog. Multimedia-Timer (Forensuche bemühen) die eine kleinere Auflösung bieten.

Larsi 4. Mär 2008 14:57

Re: Timer wird zu langsam
 
Kann mir denn keiner ein simples Beispiel dafür geben wie ich dann z.b. das löschen mehreren dateien mit einem thread mache der aktiv ist wenn man auf nen button klcikt. Das mit dem löschen krieg ich natärlich selber schon mir gehts eher um den thread!

sirius 4. Mär 2008 19:06

Re: Timer wird zu langsam
 
Wenn wir dem oben genannten Konzept bleiben:

Delphi-Quellcode:
type TCopy=class(TThread)
       constructor Create(const aPassword, aQuelle, aZiel : String);
      protected
       procedure execute; override;
      private
       FPassword:string;
       FQuelle:string;
       FZiel:string;
end;

...
constructor TCopy.Create(const aPassword, aQuelle, aZiel : String);
begin
  inherited Create(false); //false=> Thread gleich nach dem Constructor starten
  FreeOnTerminate:=True; //Objekt löschen, wenn Thread beendet wurde
  FPassword:=aPassword;
  FQuelle:=aQuelle;
  FZiel:=aZiel;
end;

procedure TCopy.execute;
begin
  XORCrypt(FPassword, FQuelle, FZiel);  
   
end;



//.... Aufruf von irgendwoher, Beispiel:

procedure TForm1.Button1click(...);
...
begin

  TCopy.create('DasPassword', Edit1.text, Edit1.text);
  //Objektzeiger brauchen wir nicht zu speichern, da er nicht mehr benötigt wird
  //Objekt gibt sich ja selber frei
end;
Das ist die einfachste Version mittels TThread. du kannst die Klasse auch noch weiter ausbauen und dich z.B. benachrichtigen lassen, wenn der Thread fertig ist, oder noch andere Sachen machen.

Larsi 5. Mär 2008 14:18

Re: Timer wird zu langsam
 
Danke aber ich glaub ich bin zu blöd :) Wie kann ich denn jetzt diese einzelne Zeile die auf keine Variablen sondern nur auf einen schon oben genannte Funktion zugreift in nen Thread packen? Am besten wärs wenn das ganze in einer Button Procedur unterbring bar wäre!
Delphi-Quellcode:
XORCrypt('DasPassword', Edit1.text, Edit1.text);

sirius 5. Mär 2008 14:45

Re: Timer wird zu langsam
 
Verdammt, jetzt habe ich den obigen Beitrag editiert, anstatt einen neuen zu schreiben :wall:

Naja, schau es dir im vorletzten Post (von hier aus) an!

Larsi 5. Mär 2008 14:51

Re: Timer wird zu langsam
 
Sry aber irgendwie kommen da ziemlich viele Fehler, wo muss das type hin?
[Pascal Hinweis] Unit3.pas(39): H2077 Auf 'XORCrypt' zugewiesener Wert wird niemals benutzt
[Pascal Fehler] Unit3.pas(67): E2029 '=' erwartet, aber Bezeichner 'Create' gefunden
[Pascal Fehler] Unit3.pas(67): E2029 '=' erwartet, aber ',' gefunden
[Pascal Fehler] Unit3.pas(67): E2029 '=' erwartet, aber ')' gefunden
[Pascal Fehler] Unit3.pas(69): E2029 '=' erwartet, aber 'PROCEDURE' gefunden
[Pascal Fehler] Unit3.pas(70): E2070 Unbekannte Direktive: 'private'
[Pascal Fehler] Unit3.pas(71): E2070 Unbekannte Direktive: 'FPassword'
[Pascal Fehler] Unit3.pas(76): E2003 Undefinierter Bezeichner: 'TThread'
[Pascal Fehler] Unit3.pas(76): E2029 '=' erwartet, aber ',' gefunden
[Pascal Fehler] Unit3.pas(76): E2029 '=' erwartet, aber ')' gefunden
[Pascal Fehler] Unit3.pas(78): E2075 Diese Form des Methodenaufrufs ist nur in Methoden von abgeleiteten Typen erlaubt
[Pascal Fehler] Unit3.pas(79): E2003 Undefinierter Bezeichner: 'FreeOnTerminate'
[Pascal Fehler] Unit3.pas(80): E2003 Undefinierter Bezeichner: 'FPassword'
[Pascal Fehler] Unit3.pas(81): E2003 Undefinierter Bezeichner: 'FQuelle'
[Pascal Fehler] Unit3.pas(82): E2003 Undefinierter Bezeichner: 'FZiel'
[Pascal Fehler] Unit3.pas(85): E2004 Bezeichner redefiniert: 'TThread'
[Pascal Fehler] Unit3.pas(87): E2003 Undefinierter Bezeichner: 'FPassword'
[Pascal Fehler] Unit3.pas(87): E2003 Undefinierter Bezeichner: 'FQuelle'
[Pascal Fataler Fehler] Project3.dpr(5): F2063 Verwendete Unit 'Unit3.pas' kann nicht compiliert werden

stahli 5. Mär 2008 14:52

Re: Timer wird zu langsam
 
Du musst einen Extra Thread für DEINE Funktion ableiten, erzeugen und ausführen...
Nach dem Erzeugen wird automatisch Execute ausgeführt, wohinein Du Deine Anweisungen schreiben kannst.
In Create kannst Du direkt Objekte oder andere Variablen übergeben.

Im Beispiel wird ein Objekt übergeben und dessen dafür bestimmte Methode vom Thread ausgeführt.
Dein Programmablauf wird dadurch (quasi) nicht beeinflusst. Der Thread erledigt die Aufgabe einfach nebenher und Dein Programm läuft normal weiter.
Der Thread arbeitet sozusagen wie ein eigenständiges Programm parallel, nur dass er den selben Speicherbereich benutzt. Deshalb darf man nicht "wahllos" in diese Bereiche schreiben, da es sonst Konflikte mit dem Programm geben kann (Syncronisation).

(... so jedenfalls, wie ich das verstanden habe)

Delphi-Quellcode:
  TMyThread = class(TThread)
  private
    FMyVar: TMyVar;
  protected
    procedure Execute; override;
  public
    constructor Create(MyVar: TMyVar);
  end;

...

procedure MyThreadStart(MyVar: TMyVar);
var
  MyThread: TMyThread;
begin
  MyThread := TMyThread.Create(MyVar);
end;

...

{ TMyThread }

constructor TMyThread.Create(MyVar: TMyVar);
begin
  FMyVar := MyVar;
  inherited Create(False);
end;

procedure TMyThread.Execute;
begin
  FMyVar.DoSomethingAsThread;
end;

stahli

DeddyH 5. Mär 2008 14:53

Re: Timer wird zu langsam
 
[edit] Bereits korrigiert :zwinker: [/edit]

sirius 5. Mär 2008 14:54

Re: Timer wird zu langsam
 
Ui, da wraen aber ein paar Fehler drin.

Larsi 5. Mär 2008 14:56

Re: Timer wird zu langsam
 
Und was muss ich verändern damit die Fehler weg sind, sirius?

sirius 5. Mär 2008 15:34

Re: Timer wird zu langsam
 
Ich hab noch ein Edit gemacht :zwinker:

Larsi 5. Mär 2008 15:47

Re: Timer wird zu langsam
 
Da kommen bei mir aber leider die gleichen Fehler, wo muss denn das type hin, vor die Procedur? Wenn nicht hab ichwas falsch gemacht :)

sirius 5. Mär 2008 15:54

Re: Timer wird zu langsam
 
Jaaa, da waren noch ein Semikolonfehler,...

Jetzt dürfte es Copy&Paste fertig sein.

gmc616 5. Mär 2008 16:18

Re: Timer wird zu langsam
 
Zitat:

Zitat von Larsi
Ich habe mal was von IdProcessMessage oder irgendwie sowas gehört, hat das was damit zu tun, ...

Meinst du das?
Delphi-Quellcode:
Application.ProcessMessages;
Wenn dein Timer (der die Grafik steuert?) langsamer wird, könnte es daran liegt, das das TimerEvent nicht ausgeführt wird, weil dein Programm grad mit etwas anderen beschäftigt ist.

ProcessMessages bewirkt, dass das Programm erst mal alle Messages die das Programm erhalten hat (darunter auch das TimerEvent), abarbeitet, bevor es im eigentlichen Code weiter macht. Bei einer Suche bietet sich so was an.

Oder man löst das mit einem Thread, wie oben beschrieben.

Larsi 5. Mär 2008 17:00

Re: Timer wird zu langsam
 
Danke hätte mir das jemand früher gesagt^^

sirius 5. Mär 2008 17:30

Re: Timer wird zu langsam
 
Zitat:

Zitat von gmc616
Meinst du das?
Delphi-Quellcode:
Application.ProcessMessages;

Pfui


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:34 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