Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Die Zeit stoppen ohne Gettickcount (https://www.delphipraxis.net/41595-die-zeit-stoppen-ohne-gettickcount.html)

whiteshark 5. Mär 2005 17:13


Die Zeit stoppen ohne Gettickcount
 
Moin Leute,

ich stehe wieder vor einem Problem. Wie kann ich die Zeit einer Function stoppen ohne die Function GetTickCount? Wenn ich GetTickCount aufrufe, bringt der Rechner immer die Fehlermeldung "ungültiger Zeigeroperation".

Matze 5. Mär 2005 17:14

Re: Die Zeit stoppen ohne Gettickcount
 
Hast du mal etwas Code, wie du GetTickCOunt aufgerufen hast?

Binärbaum 5. Mär 2005 17:19

Re: Die Zeit stoppen ohne Gettickcount
 
Zitat:

Zitat von whiteshark
Wenn ich GetTickCount aufrufe, bringt der Rechner immer die Fehlermeldung "ungültiger Zeigeroperation".

Seltsam, GetTickCount gibt aber keinen Zeiger zurück, sondern einen Cardinal (oder LongInt?). Die "ungültiger Zeigeroperation" dürfte wohl kaum an der Funktion GetTickCount selbst liegen, sondern eher an einem Fehler im Quellcode.

MfG
Binärbaum

whiteshark 5. Mär 2005 17:24

Re: Die Zeit stoppen ohne Gettickcount
 
Ein bisschen Quelltext:
Delphi-Quellcode:
procedure TForm1.InsertButtonClick(Sender: TObject);
var a:array of integer;
var voninsert, bisinsert:cardinal;
begin
laenge:=memo1.lines.count;
setlength(a,laenge);
ein(a);
voninsert:=GetTickCount;
insert(a);
bisinsert:=GetTickCount;
aus(a);
summe:=bisinsert-voninsert;
InsertLabel.Caption:='';
if (summe>1000) then InsertLabel.Caption:=floattostr(summe/1000)+' s'
                else InsertLabel.Caption:=floattostr(summe)+' ms';
In diesem Programm soll der Sortieralgorithmus "Insert-Sort" aufgerufen werden.
1) Zahlen einlesen mit der Funktion "ein(a)"
2) Zeit nehmen
3) Sortieren mit der Funktion "insert(a)"
4) Zeit nehmen
5) Zahlen ausgeben mit der Funktion
6) Differenz aus zweiter Zeit und erster Zeit

Aber wo soll der Fehler sein? :gruebel:

Dax 5. Mär 2005 17:27

Re: Die Zeit stoppen ohne Gettickcount
 
Was tut denn die Funktion "ein"?

Matze 5. Mär 2005 17:30

Re: Die Zeit stoppen ohne Gettickcount
 
Tritt der Fehler auch auf, wenn du anstelle von "GetTickCount" Zahlen einsetzt?
Teste das bitte mal, denn es könnte an den aufzurufenden Funktionen liegen.

whiteshark 5. Mär 2005 17:32

Re: Die Zeit stoppen ohne Gettickcount
 
@Dax: Die Zahlen aus einer MemoBox einlesen.

@Matze: der gleiche Fehler kommt auch, wenn ich Zahlen einsetze.

Matze 5. Mär 2005 17:36

Re: Die Zeit stoppen ohne Gettickcount
 
Zitat:

Zitat von whiteshark
@Matze: der gleiche Fehler kommt auch, wenn ich Zahlen einsetze.

Dann benötigen wir die anderen Funktionen, denn es liegt folglich nicht an GetTickCount.

whiteshark 5. Mär 2005 18:30

Re: Die Zeit stoppen ohne Gettickcount
 
Delphi-Quellcode:
function bubble (var a:array of integer):integer;
var j,w,laenge:integer;
begin
 laenge:=form1.Memo1.Lines.Count;
 //setlength(a, laenge);
 for j:=laenge downto 1 do
        begin
        for w:=2 to j do
                begin
                if (a[w-1]>a[w]) then vertausch(a[w-1],a[w]);
                end;// end of w-for-schleife
        end; // end of j-for-schleife
end; // end of function bubble
Delphi-Quellcode:
function ein (var a:array of integer):integer;
var i:integer;
begin
 laenge:=form1.Memo1.Lines.Count;
 for i:=1 to laenge do
        begin
        a[i]:=strtoint(form1.memo1.lines[i-1]);
        end;
end; // end of function ein



function aus (var a:array of integer) :integer;
var j:integer;
begin
laenge:=form1.Memo1.Lines.Count;
for j:=1 to laenge do
        begin
        form1.memo2.Lines.Add(inttostr(a[j]));
        end;
end; // end of function aus
Das ist einmal die Funktion "Bubble-Sort", die Funktion "einlesen(ein)" und die Funktion "Ausgeben(aus)".

Irgendwo dort ist der Fehler!

axelf98 5. Mär 2005 19:18

Re: Die Zeit stoppen ohne Gettickcount
 
Ich hab mir jetzt nicht alles angeschaut aber
Delphi-Quellcode:
laenge:=form1.Memo1.Lines.Count;
//setlength(a, laenge);
for j:=laenge downto 1 do
muss zu einem Fehler führen, da Memo.Lines von 0 bis Memo.Lines.Count - 1 geht...
Vielleicht liegts ja daran (Zugriff auf nicht reservierten Speicher).

Khabarakh 5. Mär 2005 19:18

Re: Die Zeit stoppen ohne Gettickcount
 
Dynamische Arrays beginnen immer mit dem Index 0! Da dein Array laenge lang ist, knallt es natürlich am Ende von
Delphi-Quellcode:
for i:=1 to laenge do
        begin
        a[i]:=strtoint(form1.memo1.lines[i-1]);
        end;
(Btw: geniale Einrückung :mrgreen: ).
Also muss es
Delphi-Quellcode:
  for i:=1 to laenge do
    begin
    a[i-1]:=strtoint(form1.memo1.lines[i-1]);
    end;
oder gleich
Delphi-Quellcode:
  for i:=0 to laenge-1 do
    begin
    a[i]:=strtoint(form1.memo1.lines[i]);
    end;
heißen.

[edit]Ja, in der "bubble"-Prozedur genauso

Meflin 5. Mär 2005 19:22

Re: Die Zeit stoppen ohne Gettickcount
 
es geht auch ohne gettickcount: einfach nen timer nehmen, interval 1 (1 millisekunde) und dann im onTimer Event eine countvariable erhöhen :mrgreen: schwupps hast du eine tolle stoppuhr, ohne gettickcount ;)


Aenogym 5. Mär 2005 19:37

Re: Die Zeit stoppen ohne Gettickcount
 
Zitat:

Zitat von Meflin
es geht auch ohne gettickcount: einfach nen timer nehmen, interval 1 (1 millisekunde) und dann im onTimer Event eine countvariable erhöhen :mrgreen: schwupps hast du eine tolle stoppuhr, ohne gettickcount ;)

, die nicht unbedingt genau ist ;)

Aenogym

Meflin 5. Mär 2005 19:41

Re: Die Zeit stoppen ohne Gettickcount
 
Zitat:

Zitat von Aenogym
Zitat:

Zitat von Meflin
es geht auch ohne gettickcount: einfach nen timer nehmen, interval 1 (1 millisekunde) und dann im onTimer Event eine countvariable erhöhen :mrgreen: schwupps hast du eine tolle stoppuhr, ohne gettickcount ;)

, die nicht unbedingt genau ist ;)

Aenogym

naja, also immerhin auf die millisekunde genau. was willst du mehr :mrgreen:


Aenogym 5. Mär 2005 19:44

Re: Die Zeit stoppen ohne Gettickcount
 
Zitat:

Zitat von Meflin
Zitat:

Zitat von Aenogym
Zitat:

Zitat von Meflin
es geht auch ohne gettickcount: einfach nen timer nehmen, interval 1 (1 millisekunde) und dann im onTimer Event eine countvariable erhöhen :mrgreen: schwupps hast du eine tolle stoppuhr, ohne gettickcount ;)

, die nicht unbedingt genau ist ;)

Aenogym

naja, also immerhin auf die millisekunde genau. was willst du mehr :mrgreen:

[ot]einen neuen eintrag in deinem blog :D[/ot]

Robert_G 5. Mär 2005 19:55

Re: Die Zeit stoppen ohne Gettickcount
 
Ein Timer macht wohl ab 30-50ms Sinn. Da Timer die geringste Priorität überhaupt haben kannst du auch das auf einem ausgelasteten System knicken.

GetTickCount dürfte wohl die einfachste Möglichkeit sein relativ ( :!: ) genau die Zeit zu messen. ;)
Zitat:

Zitat von Aenogym
[ot]einen neuen eintrag in deinem blog :D[/ot]

Schleimer! :P

Khabarakh 5. Mär 2005 20:05

Re: Die Zeit stoppen ohne Gettickcount
 
Zitat:

Zitat von Aenogym
Zitat:

Zitat von Meflin
es geht auch ohne gettickcount: einfach nen timer nehmen, interval 1 (1 millisekunde) und dann im onTimer Event eine countvariable erhöhen :mrgreen: schwupps hast du eine tolle stoppuhr, ohne gettickcount ;)

, die nicht unbedingt genau ist ;)

Aenogym

Besonders weil man in der Praxis nie einen Intervall von einer Millisekunde erreichen wird. Bei minimalem Code schaffe ich auf meinem PC nur 15,6 Millisekunden.

[edit]Viel zu spät :roll: .

malo 5. Mär 2005 20:06

Re: Die Zeit stoppen ohne Gettickcount
 
Zitat:

Zitat von Meflin
Zitat:

Zitat von Aenogym
Zitat:

Zitat von Meflin
es geht auch ohne gettickcount: einfach nen timer nehmen, interval 1 (1 millisekunde) und dann im onTimer Event eine countvariable erhöhen :mrgreen: schwupps hast du eine tolle stoppuhr, ohne gettickcount ;)

, die nicht unbedingt genau ist ;)

Aenogym

naja, also immerhin auf die millisekunde genau. was willst du mehr :mrgreen:

Nein, mit min. 1 milisekunde abweichung, da der Timer dann erst "nach einer millisekunde" anfängt zu zählen. Außerdem werden etwas mehr systemressourcen benötigt, da der Timer ja eingeschaltet werden muss und dann auch noch selbst arbeiten. GetTickCount ist eine Windows-Funktion und läuft grundsätzlich IMMER, weshalb diese Funktion KEINE zusätzlichen Ressourcen verbraucht.

Wobei das jedoch schon wieder haarspaleterei ist. Wenn man genug durchläufe macht, sodass Abweichungen von 10-20ms zu anderen Algos entstehen, sind die 1-2ms Abweichung eigentlich egal ;)

Matze 5. Mär 2005 20:10

Re: Die Zeit stoppen ohne Gettickcount
 
Zu TTimer:
geringstes funktionierendes Intervall

unter Win XP: 10ms
unter Win 9x: 50ms

Also 1ms ist purer Schwachsinn, da du das nie erreichen wirst.

Nikolas 5. Mär 2005 20:12

Re: Die Zeit stoppen ohne Gettickcount
 
Zitat:

Wobei das jedoch schon wieder haarspaleterei ist. Wenn man genug durchläufe macht, sodass Abweichungen von 10-20ms zu anderen Algos entstehen, sind die 1-2ms Abweichung eigentlich egal Wink
Das ist falsch. Der Timer wird (computerabhängig) nur etwa alle 20ms aktualisiert. Wenn du also Laufzeitunterschiede in diesem Bereich hast, wirst du die nicht von den Rundungsfehlern des Timers unterscheiden können. Sinnvoll kann man den Timer mit dieser Methode erst am Unterschieden von etwa einer Sekunde, da dann die Fehler vernachlässigbar klein werden.

Tubos 5. Mär 2005 20:13

Re: Die Zeit stoppen ohne Gettickcount
 
Deshalb verwendet man Hier im Forum suchenQueryPerformanceCounter ;)

Die Muhkuh 5. Mär 2005 20:20

Re: Die Zeit stoppen ohne Gettickcount
 
@Matze

ausser mit dem DXTimer. Der packt 1ms und sogar 0.

Matze 5. Mär 2005 20:41

Re: Die Zeit stoppen ohne Gettickcount
 
Zitat:

Zitat von Spider
ausser mit dem DXTimer. Der packt 1ms und sogar 0.

Ich sprach ausdrücklich von TTimer. ;)

Und, dass der DxTimer 0ms schafft, kann ich mir nicht vorstellen.

Die Muhkuh 5. Mär 2005 20:44

Re: Die Zeit stoppen ohne Gettickcount
 
@Matze

ist aber so ;-)

Aenogym 5. Mär 2005 20:49

Re: Die Zeit stoppen ohne Gettickcount
 
Zitat:

Zitat von Spider
@Matze

ausser mit dem DXTimer. Der packt 1ms und sogar 0.

ja, du kannst 0 ms einstellen und so. aber wie bitte willst du einen code genau alle 0 millisekunden ausführen? :zwinker: denk mal drüber nach...

Aenogym

Die Muhkuh 5. Mär 2005 20:52

Re: Die Zeit stoppen ohne Gettickcount
 
Zitat:

Zitat von Aenogym
Zitat:

Zitat von Spider
@Matze

ausser mit dem DXTimer. Der packt 1ms und sogar 0.

ja, du kannst 0 ms einstellen und so. aber wie bitte willst du einen code genau alle 0 millisekunden ausführen? :zwinker: denk mal drüber nach...

Aenogym

ja, genau 0 ms packt er nicht, aber es gibt noch einen deutlichen unterschied zwischen 1 ms und 0 ms.

Matze 5. Mär 2005 20:53

Re: Die Zeit stoppen ohne Gettickcount
 
Zitat:

Zitat von Aenogym
ja, du kannst 0 ms einstellen und so. aber wie bitte willst du einen code genau alle 0 millisekunden ausführen? :zwinker: denk mal drüber nach...

Eben ;)
0ms kann man bei TTimer auch einstellen, aber wir sind leicht neben dem Thema.

Die Muhkuh 5. Mär 2005 20:59

Re: Die Zeit stoppen ohne Gettickcount
 
Zitat:

Zitat von Matze
Zitat:

Zitat von Aenogym
ja, du kannst 0 ms einstellen und so. aber wie bitte willst du einen code genau alle 0 millisekunden ausführen? :zwinker: denk mal drüber nach...

Eben ;)
0ms kann man bei TTimer auch einstellen, aber wir sind leicht neben dem Thema.

Hi,

sorry einmal noch:

Ich hab grad ma einen kleinen Test gemacht.

Ich hab zwei Variablen mit einem Timer und einem DXTimer mit einem Intervall von 1ms laufen lassen. Theoretisch müsste die Variable von DXTimer höher sein, als die vom Timer, aber diese waren genau gleich. Also schafft der Timer doch 1ms?

[edit] Du kannst beim Timer zwar 0ms einstellen, aber dann macht der nichts mehr.

malo 5. Mär 2005 21:12

Re: Die Zeit stoppen ohne Gettickcount
 
Zitat:

Zitat von Spider
Zitat:

Zitat von Matze
Zitat:

Zitat von Aenogym
ja, du kannst 0 ms einstellen und so. aber wie bitte willst du einen code genau alle 0 millisekunden ausführen? :zwinker: denk mal drüber nach...

Eben ;)
0ms kann man bei TTimer auch einstellen, aber wir sind leicht neben dem Thema.

Hi,

sorry einmal noch:

Ich hab grad ma einen kleinen Test gemacht.

Ich hab zwei Variablen mit einem Timer und einem DXTimer mit einem Intervall von 1ms laufen lassen. Theoretisch müsste die Variable von DXTimer höher sein, als die vom Timer, aber diese waren genau gleich. Also schafft der Timer doch 1ms?

Wie hast du DAS denn gemessen? :shock:

Ich hab folgendes gemacht:

DXTimer und TTimer aufs Form, 2 Labels. 2 Variablen hochgezählt und bei 10000 das jeweilige Label geändert. Das ist dann vorerst nur mit dem Auge sichtbar, aber der DXTimer war VIEL früher fertig. Wie du das gemacht hast, kann ich mir jedoch nciht wirklich vorstellen :roll:

//edit: Wobei das eigentlich wieder ein Fall für GetTickCount wäre :zwinker:

Nikolas 5. Mär 2005 21:12

Re: Die Zeit stoppen ohne Gettickcount
 
Wie lang hast du den Test denn laufen lassen? Find doch mal raus in welchen Intervallen der TTimer schaltet. Lass dann vielleicht mal den DXTimer bis zum 2,5-Fachen dieser Zeit laufen und dann den TTimer auschalten. Wenn du dir jetzt die Zeit vom TTimer anschaust, wird die dann wahrscheinlich das 2 oder das 3 fache der Intervallzeit betragen.

Meflin 6. Mär 2005 10:06

Re: Die Zeit stoppen ohne Gettickcount
 
also leute :) wenn ich das gewusst hätte... das mit dem timer war nie ein ernstgemeinter vorschlag :mrgreen:


whiteshark 6. Mär 2005 13:54

Re: Die Zeit stoppen ohne Gettickcount
 
Moin Jungs!
Ich wollte eigendlich nicht, dass ihr euch wegen mir in die Haare bekommt! Aber trotzdem danke für die vielen Antworten! :thumb:


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