Autor Beitrag
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 09.04.13 17:00 
user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:

Da Du offensichtlich meine Beiträge ignorierst, klinke ich mich hier aus. :evil:

Beste Grüße
Mathematiker


du versucht mich "umzuprogrammieren" nicht die Frage zu beantworten !
Ich möchte den Quelltext nicht ändern, sondern wissen warum die Rundung nicht stimmt... sonst müsste
Copy(T, 0, Pos(',', T)-1) bei T='3,161' eigentlich 3 ergeben und nicht 300 !

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Di 09.04.13 17:11 
Hallo,
also ich habe noch einmal
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Timer1Timer(Sender: TObject);
var T: String;
begin
   T := FloatToStr( ((Now-NL)*24*60*60) ); 
   memo1.lines.add(T);
   T := 'FpS: '+ FloatToStr( 1/((Now-NL)*24*60*60) );
   memo1.lines.add(T);
   T := 'FpS: '+ FloatToStr( Round( 1/((Now-NL)*24*60*60) ));
   memo1.lines.add(T);
   NL := Now;
   timer1.enabled:=false;
   //weitere befehle
end;

mit einem Timerinterval = 1 und dem Start mit einem Buttonclick getestet. Ich erhalte auf meiner alten Mühle
ausblenden Quelltext
1:
2:
3:
0,0160002149641514
FpS: 62,4991603075651
FpS: 62

und immer wieder ähnliche Werte, d.h., es wird vollkommen richtig gerundet. Hast Du nach der Anzeige den Timer deaktiviert?

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein


Zuletzt bearbeitet von Mathematiker am Di 09.04.13 17:14, insgesamt 1-mal bearbeitet
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Di 09.04.13 17:13 
user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,
user profile iconIhopeonlyReader hat folgendes geschrieben Zum zitierten Posting springen:
dennoch stimmt die "Rundung" nicht..

Nein!!! Die Rundung stimmt (siehe weiter oben)! Derartige Fehler macht Delphi nicht.
Das Problem ist der Timer.


Ich kann Steffen nur zustimmen, die Rundung ist nicht das Problem. Ohne Timer habe ich korrekte Werte erhalten. Möglicherweise funkt Dir der Timer dazwischen. Ich würde den rausnehmen und die Zeitmessung in einer Endlosschleife wie folgt programmieren:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
interface

var
  PROCABBRUCH : boolean = FALSE;
implementation


procedure Form1.Btn1Click(Sender : TObject);
begin
  PROCABBRUCH := true;  
end;
:
:

//Prozedur zur Zeitmessung:

  ok := TRUE;
  While ok do
  begin
    Application.ProcessMessages;
    if PROCABBRUCH then Exit;
    (Zeitmessungsroutine);
  end;


Du benötigst einen Button (btn1 oder anders bezeichnet) Dieser erhält die ONClick-Prozedur wie oben. Bei jedem Schleifendurchgang wird die Prozedur Application.Processmessages durchlaufen, also wenn Du auf den Button drückst, wird in der OnClick-Prozedur die globale Variable PROCABBRUCH auf true gesetzt udn dann bei der Abbfrage logischerweise die Endlosschleife mit Exit abgebrochen.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 09.04.13 17:35 
Um zu zeigen, dass nicht die ProgrammierART sondern Delphi einen Felder macht folgendes:
T := 'FpS: '+ FloatToStr( ( 1 / ((Now-NL)*24*60*60) )); //= 9.1
T := 'FpS: '+ FloatToStr( Round( 1 / ((Now-NL)*24*60*60) )); //= 91
T := 'FpS: '+ FloatToStr( Round( 1 / ((Now-NL)*24*60*60) )/1);//= 91
T := 'FpS: '+ FloatToStr( Round( 1 / ((Now-NL)*24*60*60) )/10); //=0.9

wenn round funktionieren würde, dann müsste wenn X/1 =91 x/10 =9.1 sein und nicht 0.9 !

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 09.04.13 17:37 
Wie sollen wir das nachvollziehen, wenn Du immer wieder auf now und nl zureifst, deren Werte wir nicht kennen?
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 09.04.13 18:11 
ich habe jetzt jede zeile für zeile "rausgenomen" (mit {}) und getestet, wann ein richtiges Ergebnis kam, und wann nicht..

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
    procedure DoIt;
    begin
    T := 'FpS: '+ FloatToStr( Round( 1/((Now-NL)*24*60*60) ));
    NL := Now;
    end;


Wunder:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
if FesteFpS then
  begin
  if TryStrToFloat(FpSRate.Text, C) then
      if ( (Now-NL)*24*60*60*C > 1 ) then 
        DoIt;
  end
else
  begin
  DoIt;
  end;

Hier kam 91 raus


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
if FesteFpS then
  begin
  if TryStrToFloat(FpSRate.Text, C) then
      if ( (Now-NL)*24*60*60*C > 1 ) then 
        DoIt;
  end
else
  begin
  //DoIt;
  end;

Hier kam 9 raus (richtige)

Das Ergebnis war immer falsch, wenn festeFpS True war und DoIt bei if not FresteFpS then ausgeführt wurde... bei False kam ein richtiges Ergebnis raus bzw. wenn vor dem 2ten DoIt ein //stand gab es keinen Fehler... wisst ihr warum?

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Di 09.04.13 18:16 
Hallo,
user profile iconIhopeonlyReader hat folgendes geschrieben Zum zitierten Posting springen:
wenn round funktionieren würde, dann müsste wenn X/1 =91 x/10 =9.1 sein und nicht 0.9 !

Also. Ich habe Deine Anweisungen im Timer(!) getestet. Ergebnis
ausblenden Quelltext
1:
2:
3:
4:
   T := 'FpS: '+ FloatToStr( ( 1 / ((Now-NL)*24*60*60) )); //= FpS: 62,4991603075651
   T := 'FpS: '+ FloatToStr( Round( 1 / ((Now-NL)*24*60*60) )); //= 62
   T := 'FpS: '+ FloatToStr( Round( 1 / ((Now-NL)*24*60*60) )/1);//= 62
   T := 'FpS: '+ FloatToStr( Round( 1 / ((Now-NL)*24*60*60) )/10); //=6,2

D.h., es wird richtig gerundet.
Irgendwie habe ich den Eindruck, dass Dein Delphi "eine Meise" hat.

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 09.04.13 18:19 
user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:

Irgendwie habe ich den Eindruck, dass Dein Delphi "eine Meise" hat.

jap :D
wenn ich es so schreibe:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
if FesteFpS then
  begin
  if TryStrToFloat(FpSRate.Text, C) then
      if ( (Now-NL)*24*60*60*C > 1 ) then 
        DoIt;
  end
else
  begin
  DoIt;
  end;

und mit F9 kompiliere, zeigt er 91 an
ABER !!!!!!!!!!
kompiliere ich mit F8 und drücke dann zur Laufzeit F9, so zeigt er 9 (richtig!) an....

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Di 09.04.13 18:34 
An dieser Stelle schlage ich vor, du zeigst mal komplette Quelltexte, sonst wird das hier nichts mehr. Am besten minimalisiert auf den Fehler.
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 09.04.13 18:35 
Das klingt nach irgend einem Seiteneffekt. Genaueres dazu kann man aber mangels Source nicht sagen.
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 09.04.13 18:51 
user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
An dieser Stelle schlage ich vor, du zeigst mal komplette Quelltexte, sonst wird das hier nichts mehr. Am besten minimalisiert auf den Fehler.


Der Quelltext 3 Posts vor deinem ist alles.. alle andere hatte ich in {}... außer du willst noch sowas wie
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
//Den Quelltext hierzwischen stehen haben
end;



dann sähe das so aus:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    FesteFpS: TCheckBox;
    FpSRate: TEdit;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  NL: TDateTime;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var T: String;
    C: Extended;
  procedure DoIt;
    begin
    T := 'FpS: '+ FloatToStr( Round( 1/((Now-NL)*24*60*60) ));
    NL := Now;
    end;
begin
if FesteFpS.Checked then
  begin
  if TryStrToFloat(FpSRate.Text, C) then
      if ( (Now-NL)*24*60*60*C > 1 ) then 
        DoIt;
  end
else
  begin
  DoIt;
  end;
Canvas.TextOut(10, ClientHeight-Canvas.TextHeight(T), T);
end;

end.

Form besteht aus:
Timer1: TTimer; //Interval ist 1, er ist von anfang an Enabled := True
FesteFpS: TCheckBox;// Halt an und ausmachbar (von anfang an aus)
FpSRate: TEdit; //steht von anfang an 1 drin


Hierbei ensteht ein der Fehler... starte ich mit F8 und danach F9 funktioniert alles.. aber direkt F9 ist ein Fehler...
Wenn ich mit F8 zuerst gestartet habe, es dann klappt, dann Die Zahl im Edit größer als 70 wird, ist die angezeigte Zahl 66.. gehe ich nun wieder auf eine kleinere zahl z.B. 1, so wird die zahl 17 angezeigt.... (anstatt 1)

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 09.04.13 19:15 
Dann versuch doch erst einmal das, was ich vorher schon vorgeschlagen hatte (NOW ändert sich schließlich ständig):
Zitat:
Speicher doch zunächst Now() einmal in einer Variablen zwischen und benutz dann die zur Berechnung. Dann schreibe Dir eine Funktion für die Ermittlung der Sekunden und benutze diese. Deren Ergebnis wird dann gerundet.
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Di 09.04.13 19:47 
Ich habe nun - bis auf die Prozedur TryStrToFloat, die ich durch einen Try .. except .. end-Konstrukt ersetzt habe, die Timerroutine geprüft. Es kommen bei mir keine Fehler beim Runden. 100,1 ergibt 100 und 50,56 ergibt 51.

Selbst wenn ich statt NL := now; schreibe: NL := now - 0.12/24/60/60, was ja bei der Differenz dann immer dazu führt, dass scheinbar eine Differenz von 0.12 Sekunden mindestens auftreten, wird korrekt gerundet (entwerder ist das Ergebnis 7 oder 8.

P.S. ich habe die Differenz NOW - NL und den ungerundeten Wert 1/((Now-NL)*86400) in T ausgegeben, und die gerundeten Werte stimmen immer!!!!

Ich weiß ehrlich nicht, wo der Fehler noch stecken soll.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Di 09.04.13 20:20 
user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
Ich weiß ehrlich nicht, wo der Fehler noch stecken soll.

Now liefert ein TDateTime zurück. Zwar kann TDateTime auch Millisekunden speichern, aber Now rundet immer auf volle Sekunden (siehe Delphi-Hilfe). Die Frage ist also, ob man mit der Differenz Now - NL überhaupt sinnvoll rechnen kann. Hinzu kommt noch der große Teiler "Now-NL)*86400".
Das hier funktioniert:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
// uses MMSystem
procedure TMainform.Button1Click(Sender: TObject);
var
  Zeit  : TDateTime;
  Zeit1 : TDateTime;
  Zeit2 : TDateTime;
begin
  Zeit1 := TimeGetTime;
  Sleep(24);
  Zeit2 := TimeGetTime;
  Zeit := (Zeit2 - Zeit1);
  if Zeit > 0 then
    Label1.Caption := FloatToStr(Round((1 / Zeit) * 1000))
  else
    Label1.Caption := 'Zeit = 0!';
end;
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Di 09.04.13 20:26 
Warum nicht gettickcount?
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Di 09.04.13 20:28 
user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
Warum nicht gettickcount?

TimeGetTime hat eine höhere Auflösung.
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Di 09.04.13 20:35 
Dann halt Queryperformancecounter. Btw. hat Timegettime nicht unbedingt eine höhere Präzision, und Auflösung ist sowieso das falsche Wort.
Zudem die Frage ob der TE das hier braucht, und nicht lieber einfach mehrere Frames messen möchte. Scheinbar hat der TE mit seinem Timer aber eh ein generelles Konzeptproblem.
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Di 09.04.13 20:44 
user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
Auflösung ist sowieso das falsche Wort.

Zitat:
The resolution of the GetTickCount function is limited to the resolution of the system timer, which is typically in the range of 10 milliseconds to 16 milliseconds.

Quelle: msdn.microsoft.com/e...724408(v=vs.85).aspx
Ich übersetze Resolution mit Auflösung. Aber das ist Erbsenzählerei.
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 09.04.13 21:43 
user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
Zudem die Frage ob der TE das hier braucht, und nicht lieber einfach mehrere Frames messen möchte. Scheinbar hat der TE mit seinem Timer aber eh ein generelles Konzeptproblem.

Das sag ich doch die ganze Zeit.
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Di 09.04.13 23:09 
Hallo,
user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
Dann halt Queryperformancecounter.

Genau. Und deshalb wiederhole ich noch einmal meinen Vorschlag:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var Time1, Time2, Freq: Int64;
    wert : extended;
begin
    QueryPerformanceFrequency(Freq);
    QueryPerformanceCounter(Time1);

    //hier Deine Zeichnung

    QueryPerformanceCounter(Time2);
    wert:=1000*(Time2-Time1)/freq;
    label1.caption:=floattostrf(wert,ffgeneral,4,3)+' ms';
    label2.caption:=floattostrf(1000/wert,ffgeneral,4,3)+' Bilder je s';
end;

Das funktioniert garantiert. Und wenn es nicht in die Zeichenroutine eingebaut werden soll, dann macht zwei Prozeduren, eine zum Start und eine zur Auswertung. Damit gibt's auch keinen Timer mehr, der offensichtlich nicht so will, wie er soll.

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein