[Lazarus] TTimer simple issue

2020-10-26 Thread Lars via lazarus

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 9 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
--
___
lazarus mailing list
lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus


Re: [Lazarus] TTimer simple issue

2020-10-26 Thread Luca Olivetti via lazarus

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

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 9 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
--
___
lazarus mailing list
lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus


Re: [Lazarus] TTimer simple issue

2020-10-27 Thread 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 9 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 9 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 9 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
lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus


Re: [Lazarus] TTimer simple issue

2020-10-27 Thread Евгений Кадисов via lazarus
The problem of your code is  that the variable  is not initialized.
Regards
Evgueny

вт, 27 окт. 2020 г. в 15:28, Santiago A. via lazarus <
lazarus@lists.lazarus-ide.org>:

> 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 9 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 9 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 9 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
> lazarus@lists.lazarus-ide.org
> https://lists.lazarus-ide.org/listinfo/lazarus
>
-- 
___
lazarus mailing list
lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus


Re: [Lazarus] TTimer simple issue

2020-10-27 Thread Darius Blaszyk via lazarus
The first multiplication is when i = 0, so it should be ok. I am wondering
though, the OP wants to calculate the factorial of 9. 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 <
lazarus@lists.lazarus-ide.org> wrote:

> The problem of your code is  that the variable  is not
> initialized.
> Regards
> Evgueny
>
> вт, 27 окт. 2020 г. в 15:28, Santiago A. via lazarus <
> lazarus@lists.lazarus-ide.org>:
>
>> 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 9 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 9 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 9 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
>> lazarus@lists.lazarus-ide.org
>> https://lists.lazarus-ide.org/listinfo/lazarus
>>
> --
> ___
> lazarus mailing list
> lazarus@lists.lazarus-ide.org
> https://lists.lazarus-ide.org/listinfo/lazarus
>
-- 
___
lazarus mailing list
lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus


Re: [Lazarus] TTimer simple issue

2020-10-27 Thread Bo Berglund via lazarus
On Tue, 27 Oct 2020 14:40:27 +0100, Darius Blaszyk via lazarus
 wrote:

>>> 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 9 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 9 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

-- 
___
lazarus mailing list
lazarus@lists.lazarus-ide.org
https://lists.lazarus-ide.org/listinfo/lazarus