Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi GetTickCount Problem (https://www.delphipraxis.net/108137-gettickcount-problem.html)

MrMyagi 7. Feb 2008 16:49


GetTickCount Problem
 
Moin allerseits,
und zwar weißt ich nicht,
warum mein GetTickCount Teil im Programm
nicht funktioniert.
Es wird beim einem ButtonClick der aktuelle
GetTickCount-Wert in der integer-Variable "start"
gespeichert und diese wird dann vom aktuellen
GetTickCount-Wert subtrahiert und falls das
Ergebnis = 1000 ms ist, soll die Progressbar
10 Stellen weiter gehen.

Delphi-Quellcode:
.
.
.
start := GetTickCount;
if (GetTickCount-start) = 1000 then
begin
Progressbar1.Position := 10;
end;
.
.
.

shmia 7. Feb 2008 16:51

Re: GetTickCount Problem
 
Delphi-Quellcode:
Progressbar1.StepBy(10);

MrMyagi 7. Feb 2008 16:52

Re: GetTickCount Problem
 
Danke für die schnelle Antwort,
ändern tuts allerdings auch nichts :(

mfG, Nico

Muetze1 7. Feb 2008 16:53

Re: GetTickCount Problem
 
Delphi-Quellcode:
start := GetTickCount;
if (GetTickCount-start) = 1000 then
Was soll der Compiler denn genau machen zwischen diesen beiden Zeilen, was 1 Sekunde dauert? Er macht einfach weiter und braucht bestimmt nicht 1 Sekunde zwischen diesen beiden Zeilen...

Noobinator 7. Feb 2008 16:54

Re: GetTickCount Problem
 
Delphi-Quellcode:
Progressbar1.Position := 10;
setzt deine Position ja immer wieder auf 10.

wenn schon dann:

Delphi-Quellcode:
Progressbar1.Position := Progressbar1.Position + 10;
um immer 10 Schritte weiter zu gehen.

OregonGhost 7. Feb 2008 16:54

Re: GetTickCount Problem
 
Der Unterschied im TickCount wird nie genau 1000 sein. Vergleiche auf Größer Gleich.

Apollonius 7. Feb 2008 16:54

Re: GetTickCount Problem
 
Zum einen solltest du nicht auf Gleichheit mit 1000 prüfen, denn du kannst kaum in jeder Millisekunde GetTickCount abfragen. Das eigentliche Problem ist meiner Meinung nach aber, dass du Start ja direkt vor der Abfrage aktualisierst. Und diese Zuweisung dauert sicherlich keine Sekunde.

MrMyagi 7. Feb 2008 16:57

Re: GetTickCount Problem
 
Eigendlich möchte ich mit GetTickCount
erreichen, dass mein Programm alle ...ms
die Progressbar "erweitert", sprich die
"Installation" vorangeht.
Ja ich weiß, dass es das jetzt noch nicht kann,
also der Endlosvorgang, aber dies war erstmal zu Testzwecken,
um zu gucken, ob er überhaupt nach 1000ms, sprich 1s etwas tut
und dies war leider nicht der Fall.


mfG, Nico

shmia 7. Feb 2008 16:57

Re: GetTickCount Problem
 
Delphi-Quellcode:
start := GetTickCount;
...

var
  msecs : integer;
begin
  msecs := GetTickCount-start;
  ProgressBar1.Position := (msecs div 1000) * 10;

Muetze1 7. Feb 2008 16:58

Re: GetTickCount Problem
 
Der Code wird einmalig abgearbeitet und dann ist gut. Wieso sollte er denn urplötzlich diesen Code wieder durchlaufen?

MrMyagi 7. Feb 2008 17:00

Re: GetTickCount Problem
 
Ja, das der Code BIS JETZT nur einmal
abgearbeitet wird ist mir bewusst, da dies ja
ersteinmal ein Test sein sollte, ob es überhaupt funktioniert.

Edit:
@shmia, der Code klappt auch nicht :(

Muetze1 7. Feb 2008 17:08

Re: GetTickCount Problem
 
Zitat:

Zitat von MrMyagi
Ja, das der Code BIS JETZT nur einmal
abgearbeitet wird ist mir bewusst, da dies ja
ersteinmal ein Test sein sollte, ob es überhaupt funktioniert.

Ja, der Fehler in dem einmaligen Beispiel habe ich und andere nun schon mehrfach geschrieben: Du speicherst den aktuellen TickCount in einer Variable und sofort danach fragst du den TickCount ab und schaust ob er schon 1 Sekunde weiter ist. Dieses sofort danach ist definitiv schneller als eine Sekunde, somit wird deine Bedingung nie erfüllt. Debug es doch selber, wobei es im Debugger wahrscheinlich klappt, da du im Einzelschrittmodus die Ausführung der Abfrage automatisch so lange verzögern wirst.

Zitat:

Zitat von MrMyagi
@shmia, der Code klappt auch nicht :(

Lass mich raten: Das von shmia extra mit "..." versehene Zuweisen von Start hast du in der selben Procedure/Methode wie die Abfrage die er darunter geschrieben hat?

MrMyagi 7. Feb 2008 17:11

Re: GetTickCount Problem
 
Nein, das habe ich in einer anderen Prozedur gepackt


mfG, Nico

Muetze1 7. Feb 2008 17:12

Re: GetTickCount Problem
 
Und wann wird die ausgeführt? Was sagt der Debugger? Kommt er zu der Stelle wo du die Progressbar veränderst? Wie sind die Werte bei der Abfrage? Du hast alles in deinem Delphi da um das Problem selber zu lösen, also nutze die wirklich vielfältigen Möglichkeiten des Debuggers von Delphi.

MrMyagi 7. Feb 2008 17:15

Re: GetTickCount Problem
 
Ja ich habe wirklich vorher
schon verdammt lange dran gesessen und immer hin und her getüfftelt,
weil das mit GetTickCount nicht so geklappt hat, wie ich will.

Im Prinzip soll es ja nur wie ein Timer funktionieren, welcher
nicht im Sekunden-Takt, sondern schneller aktualisiert.

Ich hoffe Ihr wisst jetzt was ich meine :coder2:

mfg, Nico

Nuclear-Ping 7. Feb 2008 17:17

Re: GetTickCount Problem
 
Sorry, aber stehst du auf dem Schlauch? Ich hab das Gefühl du drehst dich im Kreis. Ist dir überhaupt klar, was GetTickCount macht und wie du damit Zeitdifferenzen berechnest?

Du hast doch schon den Ansatz gehabt. Was du falsch gemacht hast, hat man dir auch schon paar mal gesagt?

MrMyagi 7. Feb 2008 17:20

Re: GetTickCount Problem
 
Wie meinst du das?
Ich habe ebend nur nochmal kurz versucht zu erläutern,
was ich eigendlich mit dem GetTickCOunt vorhabe,
weil ich dachte, dass dieses vielleicht zu kompliziert verstanden wurde
oder ähnliches. :roll:

Edit:
Ja, ich glaub das mit GetTickCount habe ich am Anfang wirklich falsch verstanden.
Allerdings glaube ich, dass ich es durch Eure Hilfe jetzt richtig verstanden habe
und mir is jetzt auch bewusst, das es bis zur Abfrage von dem Vergleich keine Sekunde dauert.
Ich habe dies erst so in mein Programm geschrieben, da ich dachte, dass die If-Anweisung solange wartet,
bis die Bedingung erfüllt ist, jedoch habe ich nicht berücksichtigt, das dies sich nicht automatisch aktualisiert.
Jedoch weiß ich dadurch nicht, wie ich dieses aktualisieren im ms-Takt, bis die Anweisung erfüllt ist,
erstellen soll

Nuclear-Ping 7. Feb 2008 17:23

Re: GetTickCount Problem
 
Naja, was soll das? Das ist weder kompliziert noch schwer.

Du brauchst ne Variable (StartTicks) die du irgendwann (FormCreate?) mit GetTickCount initialisierst.

Dann brauchst du ne Schleife, die immerwieder GetTickCount abfragt und den Start-Wert davon abzieht. Ergo hast du die Differenz in Millisekunden. Wenn dein Zielwert (1000ms = 1s) erreicht ist (auf >= (größer-gleich) und nicht nur = prüfen!), machst du das was du machen willst und setzt die StartTicks-Variable wieder mit GetTickCount, um den aktuellen Zeitwert festzuhalten und die nächsten 1000ms abzuwarten.

Noobinator 7. Feb 2008 17:27

Re: GetTickCount Problem
 
Probiers mal so

Delphi-Quellcode:
var start:Dword;
begin
start := gettickcount; // Startzeit merken
while true do // zum test mal ne Endlosschleife
  begin
     if gettickcount - start >= 1000 then //1 Sekunde abwarten
       begin
         Progressbar1.StepBy(10); // um 10 weitergehen
         start := gettickcount; // neue Zeit merken
       end;
  end;

MrMyagi 7. Feb 2008 17:28

Re: GetTickCount Problem
 
@Nuclear-Ping Sorry ,dass ich Euch soviele Nerven gekostet habe :oops:
aber ich bin mir jetzt sicher, das ich es so, wie du es
schließlich noch einmal formuliert hast verstanden habe :-D

Danke an alle

mfG, Nico

Nuclear-Ping 7. Feb 2008 17:29

Re: GetTickCount Problem
 
Delphi-Quellcode:
var
  StartTicks,
  CurTicks: LongInt;
begin
  StartTicks := GetTickCount;
  repeat
    CurTicks := GetTickCount;
    if (CurTicks - StartTicks) >= 1000 then
      begin
        StartTicks := GetTickCount; // <- reset
        ShowMessage ('1000ms vorbei');
      end;
  until FALSE;
end;

Muetze1 7. Feb 2008 18:32

Re: GetTickCount Problem
 
@Noobinator: Dein Code wird aber wohl keine Änderung in der Progressbar anzeigen, da diese nicht zum malen kommt.

@MrMyagi: Ich warte immernoch auf Antwort zu meine Frage zum Debugger...

MrMyagi 7. Feb 2008 19:49

Re: GetTickCount Problem
 
@Muetze1 Der Debugger sagt gar nichts, da es zu keinem Fehler etc führt.
Es ist halt nur so, das sich die Progressbar nicht verändert.

Noobinator 7. Feb 2008 19:52

Re: GetTickCount Problem
 
Zitat:

Zitat von Muetze1
@Noobinator: Dein Code wird aber wohl keine Änderung in der Progressbar anzeigen, da diese nicht zum malen kommt.

...

in Delphi 7 PE kopiert und funktioniert ;)

MrMyagi 7. Feb 2008 19:56

Re: GetTickCount Problem
 
@Noobinator
Jepp, bei mir klappts so auch^^

Muetze1 7. Feb 2008 20:43

Re: GetTickCount Problem
 
Zitat:

Zitat von MrMyagi
@Muetze1 Der Debugger sagt gar nichts, da es zu keinem Fehler etc führt.
Es ist halt nur so, das sich die Progressbar nicht verändert.

Was hat das eine mit dem anderen zu tun? Du hast doch einen Fehler: es funktioniert nicht. Ich habe eher das Gefühl, dass du gar nicht weißt, was dein Delphi alles kann bzw. was der Debugger hat. Schonmal einen Brechpunkt gesetzt und zeilenweise die Anweisungen durchgegangen, die Variablen angeschaut, den Stack untersucht?


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