Thread Problem: "Not enough quota is available to process this command"

Hello I have a application that spaws 2 threads every five seconds.

After a day of doing this,  I start getting this message: "Not enough quota is available to process this command"

In the C++ area I did find some answer on this subject but i'm not sure how to applied it in Delphi?


Mike Colonna
 
colonna_mikeAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

gmayoCommented:
I make that over 34000 threads in one day... what on earth are you doing?!?! Do the threads die after a while?

Geoff M.
0
RobnCommented:
"spaws 2 threads every five seconds" - what is this application doing and what is the cap on the number of threads your application creates?
Your application is eventually going to spend most of its time in context switching and die (as you have noticed).
Some people seem to believe that the more threads the application has running, the faster or more efficent it must run. This is not the case at all.

Regards,
Rob
0
colonna_mikeAuthor Commented:
Hi,
please let me explain:
As I stated earlier the application spawns 2 threads one thread checks some directories to see if any files have arrive, if so the files names and some other information is added to a Database.  The thread then ends until the next interval.

Next, the other thread will fires off and checks to see if any files have been added.
If so it does some stuff and once the database table is empty this thread will end until the next intervals

Below is the Main thread code:

procedure TForm2.OnTerminateInsert(Sender: TObject);
begin
if not Assign(Run.FatalException) then log('error in the Insert thread!!');
IsScanning := False;
 end;


procedure TForm2.OnTerminateRun(Sender: TObject);
begin
if not Assign(Run.FatalException) then log('error in the run thread!!');
ClearLabels;
isRunning := False;
bhaveFile := False;
end;

Thread 1:
procedure TForm2.InsertTimerTimer(Sender: TObject);
begin

  if not isScanning  then
  begin
       isScanning := True;
          if not Assigned(Insert) then Insert := TInsert.Create(True)
            else
             begin
               // Insert.Free;
                Insert := nil;
                Insert := TInsert.Create(True);
             end;

        Insert.FreeOnTerminate := True;
        Insert.OnTerminate :=HandleTerminateInsert;
        Insert.Resume;
 end;
end;

Thread 2:
procedure TForm2.Timer1Timer(Sender: TObject);
begin
  if not isRunning  then
  begin
            isRunning := True;
          if not Assigned(Run) then Run := TRun.Create(True)
            else
             begin
               // Run.Free;
                Run := nil;
                Run := TRun.Create(True);
             end;
        Run.FreeOnTerminate := True;
        Run.OnTerminate :=HandleTerminateRun;
        Run.Resume;
 end;
 end;


I hope this clears things up...

Mike
0
Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

colonna_mikeAuthor Commented:
Sorry,  The two OnTerminate method are not right

procedure TForm2.OnTerminateInsert(Sender: TObject);
begin
IsScanning := False;
 end;


procedure TForm2.OnTerminateRun(Sender: TObject);
begin
ClearLabels;
isRunning := False;
bhaveFile := False;
end;

0
gmayoCommented:
From the code you've posted, your threads don't appear to be ending. Run your program and look in Task Manager. Click on the Processes page. Select View -> Select Columns. Select thread count and sit back to watch your program. Do the threads stay fairly constant or is it going up every second?

Geoff M.
0
colonna_mikeAuthor Commented:
Hi gmayo

Yes threads do appear to ending?
Mike C.
0
RobnCommented:
I cannot determine if the threads are terminating or not by the code you have posted. Can you post the code in the execute method please?

Regards,
Rob
0
gmayoCommented:
Maybe there is some limitation on number of completed threads per day? That wouldn't surprise me, Windows having an artifical limit. However, that doesn't help you so all I can suggest is re-writing the thread so it doesn't end and simply waits a second for the next check.

For example:
procedure TMyThread.Execute;
begin
  ...do setup code...
   while not Terminated do begin
      ...do check code
      Sleep(1000);
   end;
   ....do cleanup code...
end;

Geoff M.
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
colonna_mikeAuthor Commented:
You know that just might work, I've beating myself up trying to figure out a way around this..

I'll give this try and let you know how I make out...


MIke C.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Delphi

From novice to tech pro — start learning today.

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.