Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus / 2020-10

TTimer simple issue

6 messages · 6 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Unknown author

When building a simple TTimer demo I cannot seem to get it working

Any idea what the problem could be if you paste this code into your form with a memo?

var
   TimeSpent: integer;
procedure TForm2.Button1Click(Sender: TObject);
var
   i, answer: integer;
begin
   Timer1.enabled := false;
   TimeSpent := 0;
   Timer1.Enabled := true;
   Timer1.interval := 1;
   for i := 0 to 999999999 do
   begin
     answer := i * answer;
   end;
   memo1.lines.add('time spent: ' + inttostr(timespent));
end;
procedure TForm2.Timer1Timer(Sender: TObject);
begin
   inc(TimeSpent);
end;

It says
time spent: 0
Whereas the time should be a lot.

Regards,
Lars

Reply by email

Luca Olivetti
to Unknown author

El 18/10/20 a les 19:18, Lars via lazarus ha escrit:

Show quoted text 33 lines
When building a simple TTimer demo I cannot seem to get it working Any idea what the problem could be if you paste this code into your form with a memo? var   TimeSpent: integer; procedure TForm2.Button1Click(Sender: TObject); var   i, answer: integer; begin   Timer1.enabled := false;   TimeSpent := 0;   Timer1.Enabled := true;   Timer1.interval := 1;   for i := 0 to 999999999 do   begin     answer := i * answer;   end;   memo1.lines.add('time spent: ' + inttostr(timespent)); end; procedure TForm2.Timer1Timer(Sender: TObject); begin   inc(TimeSpent); end; It says time spent: 0 Whereas the time should be a lot.

No, since your loop is busy waiting the Timer1Timer method is never fired. Events are only processed in the main gui loop. You could add an "Application.Processmessages" inside your loop but you must know what you are doing (e.g. you could click again button1 and that's not desirable).

Bye

Luca Olivetti Wetron Automation Technology http://www.wetron.es/ Tel. +34 93 5883004 (Ext.3010) Fax +34 93 5883007

Reply by email

Santiago A.
to Unknown author: When building a simple TTimer demo I cannot seem to get it working Any idea what the…
Lars wrote 36 lines
When building a simple TTimer demo I cannot seem to get it working Any idea what the problem could be if you paste this code into your form with a memo? var   TimeSpent: integer; procedure TForm2.Button1Click(Sender: TObject); var   i, answer: integer; begin   Timer1.enabled := false;   TimeSpent := 0;   Timer1.Enabled := true;   Timer1.interval := 1;   for i := 0 to 999999999 do   begin     answer := i * answer;   end;   memo1.lines.add('time spent: ' + inttostr(timespent)); end; procedure TForm2.Timer1Timer(Sender: TObject); begin   inc(TimeSpent); end; It says time spent: 0 Whereas the time should be a lot. Regards, Lars

I don't know what are you trying to do, but if you are trying to find out how long it takes certain process, you should try other approach. Timer is low precision and it is only fired by events, so you must process event's queue.

A first and bad approach:

for i := 0 to 999999999 do
begin
    answer := i * answer;
    application.processmessages; //<-- process event queue
end;

But this is very not a very efficient way. The best is to get the start time, get the end time and subtract.

var
   StartTime,EndTime:TDataTime;
   i, answer: integer;
begin
  StartTime:=now;
  for i := 0 to 999999999 do
  begin
     answer := i * answer;
  end;
  EndTime:=now;
  memo1.lines.add('time spent: ' + TimeToStr(EndTime-StarTime) );
end;

But TDateTime is not accurate at all if you are measuring short periods (milliseconds).

EpikTimer is a component with much better precision.

https://wiki.lazarus.freepascal.org/EpikTimer

Saludos Santiago A. -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.lazarus-ide.org/pipermail/lazarus/attachments/20201027/4b68677b/attachment.html>

Reply by email

Евгений Кадисов
to Santiago A.

The problem of your code is that the variable <answer> is not initialized. Regards
Evgueny

вт, 27 окт. 2020 г. в 15:28, Santiago A. via lazarus <

Show quoted text 90 lines
: El 18/10/2020 a las 19:18, Lars via lazarus escribió: When building a simple TTimer demo I cannot seem to get it working Any idea what the problem could be if you paste this code into your form with a memo? var TimeSpent: integer; procedure TForm2.Button1Click(Sender: TObject); var i, answer: integer; begin Timer1.enabled := false; TimeSpent := 0; Timer1.Enabled := true; Timer1.interval := 1; for i := 0 to 999999999 do begin answer := i * answer; end; memo1.lines.add('time spent: ' + inttostr(timespent)); end; procedure TForm2.Timer1Timer(Sender: TObject); begin inc(TimeSpent); end; It says time spent: 0 Whereas the time should be a lot. Regards, Lars I don't know what are you trying to do, but if you are trying to find out how long it takes certain process, you should try other approach. Timer is low precision and it is only fired by events, so you must process event's queue. A first and bad approach: for i := 0 to 999999999 do begin answer := i * answer; application.processmessages; //<-- process event queue end; But this is very not a very efficient way. The best is to get the start time, get the end time and subtract. var StartTime,EndTime:TDataTime; i, answer: integer; begin StartTime:=now; for i := 0 to 999999999 do begin answer := i * answer; end; EndTime:=now; memo1.lines.add('time spent: ' + TimeToStr(EndTime-StarTime) ); end; But TDateTime is not accurate at all if you are measuring short periods (milliseconds). EpikTimer is a component with much better precision. https://wiki.lazarus.freepascal.org/EpikTimer -- Saludos Santiago A. -- _______________________________________________ lazarus mailing list https://lists.lazarus-ide.org/listinfo/lazarus

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus/attachments/20201027/5d7af412/attachment.html>

Reply by email

Darius Blaszyk
to Евгений Кадисов

The first multiplication is when i = 0, so it should be ok. I am wondering though, the OP wants to calculate the factorial of 999999999. That would require a larger data type than an integer to store the result in! ;)

On Tue, Oct 27, 2020 at 1:46 PM Евгений Кадисов via lazarus <

Show quoted text 104 lines
wrote: The problem of your code is that the variable <answer> is not initialized. Regards Evgueny вт, 27 окт. 2020 г. в 15:28, Santiago A. via lazarus < >: > El 18/10/2020 a las 19:18, Lars via lazarus escribió: > > When building a simple TTimer demo I cannot seem to get it working > > Any idea what the problem could be if you paste this code into your form > with a memo? > > var > TimeSpent: integer; > > procedure TForm2.Button1Click(Sender: TObject); > var > i, answer: integer; > begin > Timer1.enabled := false; > TimeSpent := 0; > Timer1.Enabled := true; > Timer1.interval := 1; > for i := 0 to 999999999 do > begin > answer := i * answer; > end; > > memo1.lines.add('time spent: ' + inttostr(timespent)); > > end; > > procedure TForm2.Timer1Timer(Sender: TObject); > begin > inc(TimeSpent); > end; > > It says > time spent: 0 > Whereas the time should be a lot. > > Regards, > Lars > > > I don't know what are you trying to do, but if you are trying to find out > how long it takes certain process, you should try other approach. Timer is > low precision and it is only fired by events, so you must process event's > queue. > > A first and bad approach: > > for i := 0 to 999999999 do > begin > answer := i * answer; > application.processmessages; //<-- process event queue > end; > > But this is very not a very efficient way. The best is to get the start > time, get the end time and subtract. > > var > StartTime,EndTime:TDataTime; > i, answer: integer; > begin > StartTime:=now; > for i := 0 to 999999999 do > begin > answer := i * answer; > end; > EndTime:=now; > memo1.lines.add('time spent: ' + TimeToStr(EndTime-StarTime) ); > end; > > But TDateTime is not accurate at all if you are measuring short periods > (milliseconds). > > EpikTimer is a component with much better precision. > > https://wiki.lazarus.freepascal.org/EpikTimer > > > -- > Saludos > > Santiago A. > > -- > _______________________________________________ > lazarus mailing list > > https://lists.lazarus-ide.org/listinfo/lazarus > -- _______________________________________________ lazarus mailing list https://lists.lazarus-ide.org/listinfo/lazarus

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus/attachments/20201027/e6dc8fc7/attachment-0001.html>

Reply by email

Bo Berglund
to Darius Blaszyk
Darius Blaszyk wrote 18 lines
>> But this is very not a very efficient way. The best is to get the start >> time, get the end time and subtract. >> >> var >> StartTime,EndTime:TDataTime; >> i, answer: integer; >> begin >> StartTime:=now; >> for i := 0 to 999999999 do >> begin >> answer := i * answer; >> end; >> EndTime:=now; >> memo1.lines.add('time spent: ' + TimeToStr(EndTime-StarTime) ); >> end; >> >> But TDateTime is not accurate at all if you are measuring short periods >> (milliseconds).
var
  StartTime,EndTime: Int64;
  i, answer: integer;
begin
  answer := 1;
  StartTime := GetTickCount64;
  for i := 0 to 999999999 do
  begin
    answer := i * answer; //What does this really do?
  end;
  EndTime := GetTickCount64;
  memo1.lines.add('ms spent: ' + IntToStr(EndTime-StartTime));
end;

Now() is an extremely bad time source since it is really only fairly accurate to seconds. It also uses floating point so it is rounding. Int64 holds the same bumber of bits as a double but all of it is dedicated to the number.

Bo Berglund Developer in Sweden

Reply by email