Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi GetTickCount (https://www.delphipraxis.net/65619-gettickcount.html)

ontorius 18. Mär 2006 22:22


GetTickCount
 
Ich habe folgendes geschrieben:

Delphi-Quellcode:
procedure TForm1.trash;
var start:longint;
    i:integer;
begin
  repeat
    start:=gettickcount;
    if start+50=gettickcount then image4.picture.LoadFromFile('.\pics\trash_open1.bmp');
    if start+100=gettickcount then image4.Picture.loadfromfile('.\pics\trash_open2.bmp');
    if start+150=gettickcount then image4.Picture.LoadFromFile('.\pics\trash_blum.bmp');
    if start+2150=gettickcount then image4.Picture.loadfromfile('.\pics\trash.bmp');
    inc(i);
  until i=10;
end;
An der Stelle wo das Programm die oben genannte Prozedur aufruft, bleibt es einfach stehen und man kann darin nichts mehr machen. Wie muss man mit "GettickCount" umgehen?

3_of_8 18. Mär 2006 22:23

Re: GetTickCount
 
Wie wäre es, wenn du statt dem = ein <= nimmst? So wie es jetzt ist, geht das nur, wenn der Computer es exakt in der richtigen Millisekunde schafft.

EDIT: Der Fehler liegt noch wo ganz anders. Du musst es so machen:

Delphi-Quellcode:
procedure TForm1.trash;
var start:longint;
    i:integer;
begin
  repeat
    start:=gettickcount;
    repeat Application.ProcessMessages until GetTickCount>=start+50;
    image4.picture.LoadFromFile('.\pics\trash_open1.bmp');
    repeat Application.ProcessMessages until GetTickCount>=start+100;
    image4.Picture.loadfromfile('.\pics\trash_open2.bmp');
    repeat Application.ProcessMessages until GetTickCount>=start+150;
    image4.Picture.LoadFromFile('.\pics\trash_blum.bmp');
    repeat Application.ProcessMessages until GetTickCount>=start+250;
    image4.Picture.loadfromfile('.\pics\trash.bmp');
    inc(i);
  until i=10;
end;

ontorius 18. Mär 2006 22:36

Re: GetTickCount
 
Zitat:

Zitat von 3_of_8
Wie wäre es, wenn du statt dem = ein <= nimmst? So wie es jetzt ist, geht das nur, wenn der Computer es exakt in der richtigen Millisekunde schafft.

EDIT: Der Fehler liegt noch wo ganz anders. Du musst es so machen:

Delphi-Quellcode:
procedure TForm1.trash;
var start:longint;
    i:integer;
begin
  repeat
    start:=gettickcount;
    repeat Application.ProcessMessages until GetTickCount>=start+50;
    image4.picture.LoadFromFile('.\pics\trash_open1.bmp');
    repeat Application.ProcessMessages until GetTickCount>=start+100;
    image4.Picture.loadfromfile('.\pics\trash_open2.bmp');
    repeat Application.ProcessMessages until GetTickCount>=start+150;
    image4.Picture.LoadFromFile('.\pics\trash_blum.bmp');
    repeat Application.ProcessMessages until GetTickCount>=start+250;
    image4.Picture.loadfromfile('.\pics\trash.bmp');
    inc(i);
  until i=10;
end;

Was ist "Application.ProcessMessages"? Ich will versuchen, möglichst ohne dass das Programm aussetzt, dass die Bilder nach einer bestimmten zeit angezeigt werden.

3_of_8 18. Mär 2006 22:40

Re: GetTickCount
 
Application.ProcessMessages ist in diesem Fall nur ein Füller und heißt so viel wie "nichts tun bis 50 ms um sind."

Da ruckelt absolut gar nix. So wie du das gemacht hast, geht er das durch:

start:=GetTickCount; //also ist start der Anfangswert
if start+50=GetTickCount... //Hier ist höchstens eine Millisekunde vergangen, also ist die Bedingung nicht erfüllt und so geht das auch bei den anderen Bedingungen.

Du musst praktisch WARTEN bis die 50 ms um sind, und das passiert bei meinem Code.

Basilikum 18. Mär 2006 22:40

Re: GetTickCount
 
Zitat:

Zitat von ontorius
Delphi-Quellcode:
procedure TForm1.trash;
var start:longint;
    i:integer;
begin
  repeat
    start:=gettickcount;
    if start+50=gettickcount then image4.picture.LoadFromFile('.\pics\trash_open1.bmp');
    if start+100=gettickcount then image4.Picture.loadfromfile('.\pics\trash_open2.bmp');
    if start+150=gettickcount then image4.Picture.LoadFromFile('.\pics\trash_blum.bmp');
    if start+2150=gettickcount then image4.Picture.loadfromfile('.\pics\trash.bmp');
    inc(i);
  until i=10;
end;
An der Stelle wo das Programm die oben genannte Prozedur aufruft, bleibt es einfach stehen und man kann darin nichts mehr machen. Wie muss man mit "GettickCount" umgehen?

das "Stehenbleiben" hängt vermutlich damit zusammen, dass du i nicht initialisierst.... wenn nun i vor repeat zufälligerweise genau 11 ist, so wird die Schlaufe ca. 4'000'000'000 durchlaufen... und das dauert seine Zeit...
füge mal ein i:=0 vor repeat ein....

Daniel G 18. Mär 2006 22:43

Re: GetTickCount
 
Zitat:

Zitat von ontorius
Was ist "Application.ProcessMessages"?

Mit dieser Anweisung verarbeitet eine Anwendung die Nachrichten, die an das Fenster geschickt werden. Auf gut deutsch:

Dat inner Schleife und die Anwendung friert für die Dauer der Schleife nicht ein.

//Edit: roter Kasten, ick vermiss dir.. :zwinker:

ontorius 18. Mär 2006 22:52

Re: GetTickCount
 
Zitat:

Zitat von Daniel G
Zitat:

Zitat von ontorius
Was ist "Application.ProcessMessages"?

Mit dieser Anweisung verarbeitet eine Anwendung die Nachrichten, die an das Fenster geschickt werden. Auf gut deutsch:

Dat inner Schleife und die Anwendung friert für die Dauer der Schleife nicht ein.

//Edit: roter Kasten, ick vermiss dir.. :zwinker:

Und ob. Ich habs vorher mit 4 timern ausprobiert, da hats nichts geruckelt. Aber jetzt mit dem "Application.ProcessMessages" kann man das Ruckeln nich mehr übersehn.

ontorius 18. Mär 2006 23:05

Re: GetTickCount
 
Zitat:

Zitat von 3_of_8
Application.ProcessMessages ist in diesem Fall nur ein Füller und heißt so viel wie "nichts tun bis 50 ms um sind."

Da ruckelt absolut gar nix. So wie du das gemacht hast, geht er das durch:

start:=GetTickCount; //also ist start der Anfangswert
if start+50=GetTickCount... //Hier ist höchstens eine Millisekunde vergangen, also ist die Bedingung nicht erfüllt und so geht das auch bei den anderen Bedingungen.

Du musst praktisch WARTEN bis die 50 ms um sind, und das passiert bei meinem Code.

Vielleicht sollte ich noch dazo sagen, dass ich nebenbei noch einen timer habe, der auch einige delays beinhaltet. Können diese in verbindung mit dem gettickcount zu übermäßigen ruckeln führen?

3_of_8 18. Mär 2006 23:05

Re: GetTickCount
 
Jetzt tu mir nen Gefallen und benutze diesen Code. Einfach ausprobieren, bevor du mögliche Fehler kritisierst. Nebenbei würde ich die Bilder eher in eine ImageList laden, die Dinger 16 mal in der Sekunde aus der Datei zu laden ist ineffizient.

EDIT: Was meinst du, wie ein Timer funktioniert? Das ist nichts anderes als GetTickCount schön in ne Klasse verpackt.

Delphi-Quellcode:
procedure TForm1.trash;
var start:longint;
    i:integer;
begin
  i:=0;
  repeat
    start:=gettickcount;
    repeat Application.ProcessMessages until GetTickCount>=start+50;
    image4.picture.LoadFromFile('.\pics\trash_open1.bmp');
    repeat Application.ProcessMessages until GetTickCount>=start+100;
    image4.Picture.loadfromfile('.\pics\trash_open2.bmp');
    repeat Application.ProcessMessages until GetTickCount>=start+150;
    image4.Picture.LoadFromFile('.\pics\trash_blum.bmp');
    repeat Application.ProcessMessages until GetTickCount>=start+250;
    image4.Picture.loadfromfile('.\pics\trash.bmp');
    inc(i);
  until i=10;
end;

ontorius 18. Mär 2006 23:18

Re: GetTickCount
 
Zitat:

Nebenbei würde ich die Bilder eher in eine ImageList laden
Kannst du mir das mit der ImageList erklären?
Den Code hab ich ausprobiert und es ruckelt, das hats bei den 4 timern für jedes bild nich getan.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:43 Uhr.
Seite 1 von 3  1 23      

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