AGB  ·  Datenschutz  ·  Impressum  







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

Timer Reset ?

Ein Thema von BBoy · begonnen am 20. Feb 2007 · letzter Beitrag vom 24. Feb 2017
Antwort Antwort
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.283 Beiträge
 
Delphi 12 Athens
 
#1

AW: Timer Reset ?

  Alt 24. Feb 2017, 07:35
Ja genau, TTimer in VCL. Das ist ganz merkwürdig. Hab ich so auch noch nie erlebt. Zur Reproduktion des Fehlers habe ich ein ganz einfaches Testprogramm gebastelt:
Delphi-Quellcode:
unit Unit5;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
    FCounter: Integer;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FCounter:= 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Inc(FCounter);
  Timer1.Enabled:= TRUE;
  Timer1.Enabled:= FALSE;
  Timer1.Enabled:= TRUE;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Caption:= IntToStr(FCounter);
  Timer1.Enabled:= FALSE;
end;

end.
Die dreifache Wertänderung habe ich gemacht um sicher zu gehen, dass in jedem Fall eine Wertänderung eintritt, egal wie Timer1.Enabled im Moment des Buttonclicks besetzt ist. Das Intervall lasse ich auf den standardmäßigen 1000 ms.

Normalerweise müsste sich die Zahl im Fenstercaption immer exakt 1 Sekunde nach dem Buttonclick um 1 erhöhen. Tatsächlich aber scheint es ein Zufallswert zwischen 0 und 1000 ms zu sein.

Jetzt hatte ich auch zuerst Windows im Verdacht. Also virtuelle Maschine geöffnet, da ist ein Win 10 drauf (Host = Win 7). Gleicher Effekt. Jetzt kommts aber: Gehe ich mit der selben EXE auf einen anderen physischen Rechner, läuft es ganz normal.

Jetzt würde mich mal interessieren, wie Windows den Timer bzw. GetTickCount realisiert. Soweit ich weiß sollte das doch ein mehr oder weniger "geeichtes" Signal aus einem Quarz auf dem Mainboard sein, oder? Wenn der einen an der Marmelade hätte, müsste doch auch die Systemzeit aus dem Ruder laufen, und zwar auffallend stark. Die aber scheint keine Probleme zu haben. Selbst dann nicht, wenn ich ein Live-Linux von DVD starte.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Timer Reset ?

  Alt 24. Feb 2017, 08:17
Hallo,

Zitat:
Normalerweise müsste sich die Zahl im Fenstercaption immer exakt 1 Sekunde nach dem Buttonclick um 1 erhöhen.
Wie kommst du denn auf die Idee?
Ein Windows-Standard-Timer ist sehr ungenau.

Eine Timer-Nachricht hat zusammen mit WM_PAINT eine geringere Priorität als andere Nachrichten.

Windows ist von Haus aus kein Echtzeit-Betriebssytem.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.283 Beiträge
 
Delphi 12 Athens
 
#3

AW: Timer Reset ?

  Alt 24. Feb 2017, 08:55
Eine Timer-Nachricht hat zusammen mit WM_PAINT eine geringere Priorität als andere Nachrichten.
Exakt solltest du nicht im wörtlichen Sinne auffassen. Aber gerade wenn Timer-Nachrichten eine geringere Priorität hätte, müsste die Zeitspanne doch eher größer werden als kleiner. Hier habe ich aber den Effekt, dass es teils deutlich unter einer Sekunde ist.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.166 Beiträge
 
Delphi 12 Athens
 
#4

AW: Timer Reset ?

  Alt 24. Feb 2017, 10:37
Zitat:
Ein Windows-Standard-Timer ist sehr ungenau.
Naja, aber 0 ... 1000ms sollte es nicht sein.
Ich würde mal sagen +/- 50ms könnten drin sein.

Aber du machst ja gar keine echte Messung, nur das Caption hochzählen.
Könnte auch sein dass das Neuzeichen des Captions so lange braucht.

- Das würde ich dan mit QueryPerformanceCounter oder TStopWatch mal genau nachmessen
- und Caption mit Repaint edtwas forcieren

Rollo
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.283 Beiträge
 
Delphi 12 Athens
 
#5

AW: Timer Reset ?

  Alt 24. Feb 2017, 12:25
Zitat:
Ein Windows-Standard-Timer ist sehr ungenau.
Naja, aber 0 ... 1000ms sollte es nicht sein.
Ich würde mal sagen +/- 50ms könnten drin sein.

Aber du machst ja gar keine echte Messung, nur das Caption hochzählen.
Könnte auch sein dass das Neuzeichen des Captions so lange braucht.
Wie gesagt, es ist ein seeeehr einfaches Testprogramm. Ich habe lediglich eine ungefähre Testmethode gebraucht. Aber auch du liegst falsch: Der Timer kommt in zu kurzen Intervallen, insofern ist die Repaint-Zeit vom Caption irrelevant ^^

Erfahrungsgemäß läuft gerade das NCPaint aber sehr flott ab, wesentlich höher priorisiert als Paints in der ClientArea. Deswegen verwende ich das gerne für Quick-and-Dirty-Tests. Ich konnte das Timer-Intervall auch auf 10 Sekunden stellen und es kommt teilweise < 1 Sekunde.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden

Geändert von Codehunter (24. Feb 2017 um 12:27 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.166 Beiträge
 
Delphi 12 Athens
 
#6

AW: Timer Reset ?

  Alt 24. Feb 2017, 13:26
Mal blöde Frage, benutzt du VmWare oder VirtualBox, oder *würg* Parallels ?

Rollo
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.283 Beiträge
 
Delphi 12 Athens
 
#7

AW: Timer Reset ?

  Alt 24. Feb 2017, 14:29
Mal blöde Frage, benutzt du VmWare oder VirtualBox, oder *würg* Parallels ?
VirtualBox. Aber bevor du dich jetzt zu sehr auf die Virtualisierung versteifst: Das Problem trat zuerst nicht-virtualisiert auf der Hostmaschine auf.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  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 04:26 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