[Lazarus] TTimer simple issue

Darius Blaszyk dhkblaszyk at gmail.com
Tue Oct 27 14:40:27 CET 2020


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 <
lazarus at lists.lazarus-ide.org> wrote:

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


More information about the lazarus mailing list