AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein GetTickCount beeinflusst von PC Auslastung
Thema durchsuchen
Ansicht
Themen-Optionen

GetTickCount beeinflusst von PC Auslastung

Ein Thema von MisterIXI · begonnen am 4. Jun 2015 · letzter Beitrag vom 5. Jun 2015
Antwort Antwort
Popov
(Gast)

n/a Beiträge
 
#1

AW: GetTickCount beeinflusst von PC Auslastung

  Alt 4. Jun 2015, 19:39
Also die Zeit zu messen in dem man im Timer OnTimer Ereignis die Zeit, bzw. Ticks addiert ist leider ein unsinniges Unterfangen. Das Intervall ist nicht gleichmäßig. Stellt man das Intervall auf 100 ms, kann, wird aber eher nicht, das Ereignis 10 mal in der Sekunde aufgerufen werden. Somit bringt das nichts.

Besser ist den Zeitunterschied zu messen, z. B. so:
Delphi-Quellcode:
uses
  DateUtils;

var
  T1, T2: TTime;


procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Interval := 1;
  Timer1.Enabled := False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  T1 := 0;
  T2 := 0;

  Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  MSBetween: Int64;
  TimeTemp: TTime;
begin
  if T1 = 0 then
    T1 := Time;

  T2 := Time;
  MSBetween := MilliSecondsBetween(T1, T2);
  TimeTemp := MSBetween / 24 / 60 / 60 / 1000;
  Label1.Caption := FormatDateTime('hh:nn:ss:zzz', TimeTemp);
end;
Beim Start wird die aktuelle Uhrzeit gemessen. Danach wird immer die Differenz zu der Startzeit gemessen. Da die Uhrzeit separat getaktet wird, sollte PC Auslastung keine Rolle spielen.

//EDIT:

Ich hab mir das Ganze mal angeguckt und da sind einige unnötige Zeilen. Der Code oben nur etwas kürzer:
Delphi-Quellcode:
uses
  DateUtils;

var
  T1: TTime;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Interval := 1;
  Timer1.Enabled := False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  T1 := 0;
  Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  TimeTemp: TTime;
begin
  if T1 = 0 then
    T1 := Time;

  TimeTemp := MilliSecondsBetween(T1, Time) / 24 / 60 / 60 / 1000;
  Label1.Caption := FormatDateTime('hh:nn:ss:zzz', TimeTemp);
end;

Geändert von Popov ( 4. Jun 2015 um 21:51 Uhr)
  Mit Zitat antworten Zitat
MisterIXI

Registriert seit: 4. Jun 2015
15 Beiträge
 
Delphi 7 Personal
 
#2

AW: GetTickCount beeinflusst von PC Auslastung

  Alt 4. Jun 2015, 21:38
Vielen Dank für die schnellen Antworten!

(Und nochmal zur Anmerkung: meine Kenntnisse gehen kaum über ausgeweitete Grundkenntnisse hinaus, und ich bringe mir alles nach und nach anhand von Beispielen bei)

Zitat:
Delphi-Referenz durchsuchenTStopwatch
Multimedia-Timer
QueryPerformanceCounter
ASM RDTSC (Read Time Stamp Counter)
uvm.
Ich habe (das erste mal überhaupt) einen Multimedia Timer (den CKMultimediaTimer) als Komponente installiert. Allerdings weißt er dasselbe Problem auf, nur etwas weniger.

Also die Idee mit GetLocalTime hatte ich erst auch, aber da ich irgendwie nicht herausgefunden habe wie ich das zu benutzen habe, hatte ich es dann doch gelassen. Und jetzt als ich versucht habe das so zu benutzen, gibt mir Delphi immer den fehler "nicht genügent wirkliche Parameter" und was ich dann in die Klammer setzen soll finde ich irgendwie auch nicht heraus.
Was ich gefunden habe war [...] GetlocalTime(_Systemtime(now));
Ich bin mit mehr oder weniger ausprobieren an diesen Punkt gekommen. Aber egal ob ich nun now oder eine Zahl eingebe sagt mir Delphi: "ungültige Typunwandlung" :/


Und den Vorschlag von Popov versuche ich jetzt mal zu implementieren und zu verstehen.

Wenn das -warumauchimmer- auch nicht klappen sollte versuche ich wohl mal alles über die TStopwatch zu machen

Geändert von MisterIXI ( 4. Jun 2015 um 21:51 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#3

AW: GetTickCount beeinflusst von PC Auslastung

  Alt 4. Jun 2015, 21:52
Es sollte klappen.
  Mit Zitat antworten Zitat
MisterIXI

Registriert seit: 4. Jun 2015
15 Beiträge
 
Delphi 7 Personal
 
#4

AW: GetTickCount beeinflusst von PC Auslastung

  Alt 4. Jun 2015, 22:27
Auch wenn ich gerne sagen würde dass es geht, muss ich leider enttäuscht sagen, dass ich diese Version eines Timers zwar komplett verstehe, und auch keine Fehler bekomme , allerdings bleibt er immer auf 00:00:000 stehen.
Ich hasse es wenn es von der Logik gehen müsste, aber es einfach nicht geht

Ich gehe persönlich davon aus, dass bei mir "time" vielleicht nicht richtig abgegriffen wird?
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#5

AW: GetTickCount beeinflusst von PC Auslastung

  Alt 4. Jun 2015, 22:55
Der Timer1 ist nicht dazu da um etwas zu zählen, schon gar nicht Ticks, sondern nur um den aktuellen Stand in Label1.Caption anzuzeigen:
Delphi-Quellcode:
uses
  DateUtils; //Die Unit DateUtils wird für die Funktion MilliSecondsBetween benötigt

var
  T1: TTime; //Globale TTime Variable um die Startzeit zu merken

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Interval ist für die Zählung irrelevant.
  // Sagt nur aus wie oft die Anzeige aktualisiert wird.
  Timer1.Interval := 1;
  Timer1.Enabled := False; //Timer1 zuerst deaktivieren
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Es wird nicht ab 0 gezählt.
  // Die 0 ist nur dazu da um festzustellen ob T1 bereits einen Wert hat
  T1 := 0;
  Timer1.Enabled := True; // Stoppur starten
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  TimeTemp: TTime;
begin
  if T1 = 0 then // Wenn T1 = 0, dann ist es der ersten Durchlauf
    T1 := Time; // In dem Fall die Startzeit merken

  // Nun die Differenz (Int64) zwischen Startzeit und aktuellen Zeit vergleichen.
  // Bei TDateTime sind ganze Werte Daten, Nachkommawerte Zeiten.
  // Deshalb TimeTemp durch 24 Stunden, 60 Minuten, 60 Sekunden und 1000 Millisekunden teilen
  // Ergebnis ist eigentlich Zeit ab 00:00:00 Uhr
  TimeTemp := MilliSecondsBetween(T1, Time) / 24 / 60 / 60 / 1000;
  // Was angezeigt wird ist eigentlich die Uhrzeit, man merkt aber keinen Unterschied
  Label1.Caption := FormatDateTime('hh:nn:ss:zzz', TimeTemp);
end;
  Mit Zitat antworten Zitat
MisterIXI

Registriert seit: 4. Jun 2015
15 Beiträge
 
Delphi 7 Personal
 
#6

AW: GetTickCount beeinflusst von PC Auslastung

  Alt 4. Jun 2015, 23:08
Okay auf die Idee hätte ich mal vorher kommen können: in einem neu geöffnetem Projekt funktioniert der Code. Allerdings in dem ganzen Konstrukt nicht <.<
Danke die kommentierte Version hat mir das ganze nocheinmal klar gemacht.
Ich versuche jetzt mal die Stelle zu finden an der es hakt indem ich systematisch auskommentiere.
  Mit Zitat antworten Zitat
MisterIXI

Registriert seit: 4. Jun 2015
15 Beiträge
 
Delphi 7 Personal
 
#7

AW: GetTickCount beeinflusst von PC Auslastung

  Alt 4. Jun 2015, 23:41
Ok Ich habe meinen Fehler gefunden...
Ich hatte eine Variable vorher "Time" genannt, die immer durch den Zähler verändert wurde - logischerweise blieb es die ganze Zeit über auf Null.
Jetzt, da ich die Variable umbenannt habe, läuft der Timer ganz normal hoch.

Ich habe mein ganzes Programm inzwischen auch schon umgeschrieben, dass es mit den Werten auch rechnet und alles funktioniert

Vielen, vielen Dank für die Hilfe!! Das ist echt riesig!
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 06:36 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