Out of timers

Hi,

My application uses a lot of timers while running.
After a few days of running, it is unable to create timers., i.e.
it is unable to execute "TTimer.Create", probably because of lack of system resources.
Even when I restart my application it still happens, and only when I reboot the computer I can continue working.

I work on windows NT 4.0 service pack 3 and Delphi 3.
I am pretty sure that I do free every timer I use, and I am suspecting that the NT has a limit for using timers.
I have checked for memory and resource leaks using TurboPower's Memory Sleuth, and there were no leaks.

Thanks,
  Ori.
orisAsked:
Who is Participating?
 
msediConnect With a Mentor Commented:
Hello,

sorry I couldn't find anything whether there is a restriction to the timer. Just look in the Win32 API Help. But I will have a look in the MSDN maybe there's an answer. By the way Epsylon is right FreeAndNil is new in D5. Here's the code of FreeAndNil, it's rather simple:

procedure FreeAndNil(var Obj);
var
  P: TObject;
begin
  P := TObject(Obj);
  TObject(Obj) := nil;  // clear the reference before destroying the object
  P.Free;
end;


Good luck,
Martin
0
 
MotazCommented:
Make sure that you assign nil to Timer.OnTimer

Motaz
0
 
God_AresCommented:
How many timers are you using at once?

for what purpose?
0
Cloud Class® Course: SQL Server Core 2016

This course will introduce you to SQL Server Core 2016, as well as teach you about SSMS, data tools, installation, server configuration, using Management Studio, and writing and executing queries.

 
TheNeilCommented:
There IS a limit on th number of timers that Windows can support simultaneously (can't remember what it is but 8 seems to be familair). Have you thought about using threads?

The Neil =:(
0
 
shenqwCommented:
you must release the timer when you don't need it.

I think you don't need so many timer.you can do it like this

var
 aTimeCounter:array of [0..255] of integer;
 aTimeLimit:array of [0..255] of integer;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  i:integer;
begin
  for i:=0 to 255 do
  begin
    Inc(aTimeCounter[i]);
    if aTimeCounter[i]>aTimerLimit then
    begin
      //PostMessage or SendMessage
      aTimeCounter[i]:=0;
    end;
  end;
end;

0
 
msediCommented:
Hello,

you said you are sure you free a the timers. In order to check if that's right. Put a counter for created and a counter for freed timers. If there's a difference you know it definitely.

In order to free the timer use FreeAndNil("Timer") in order to force the Timer to be removed from the memory.

Good luck, Martin
0
 
mullet_attackCommented:
Hey msedit, thanks for the 'freeandnil' proc !

I've been using Delphi for 5 years, and I have never seen it !

Thanks, you can always learn...
0
 
EpsylonCommented:
FreeAndNil is new in Delphi 5....
0
 
orisAuthor Commented:
Adjusted points from 250 to 300
0
 
orisAuthor Commented:
msedi:
I did try putting counters and the results were (num of creates) - (num of frees) = 0.
I use Delphi 3, so I don't have the ability to use "FreeAndNil".

I suspect that NT has an absolute limit for using timers during an NT session.
0
 
MadshiCommented:
I cannot image that there would be a timer restriction in NT. How many timers do you have to create from a fresh boot of the system until you get the error?
Try to do something like this to test it:

var i1 : integer;
begin
  for i1 := 0 to 10000 do
    with TTimer.Create do
      try
        // here set all the properties
      finally Free end;

Does this simple program fail, too? Then it's the proove that either the TTimer component or Windows itself has a bug or restriction.

Regards, Madshi.
0
 
orisAuthor Commented:
I did some experiments, and there is a very good chance that I have a bug somewhere else in my program.

Martin,
I appreciate your efforts, so I will accept your comment as the answer.
Thanks,
Ori.
oris@math.tau.ac.il
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.