вопрос по службам

 

Запустил простенький скрипт как службу. 

OnStart()
{
        some code;
Sleep(1000); 
OnStart();
}

Ну т.е. служба каждую секунду что-то считает.
Но со временем приходит Stack Overflow. 
Как правильно сделать чтоб этого не было ? 

 
while (!IsStopped())
{
  // some code

  Sleep(100);
}
 
Dmitiry Ananiev:

Запустил простенький скрипт как службу. 

Ну т.е. служба каждую секунду что-то считает.
Но со временем приходит Stack Overflow. 
Как правильно сделать чтоб этого не было ? 

Есть два режима управления памятью: очередь и стек. 

 
Dmitiry Ananiev:

Запустил простенький скрипт как службу. 

Ну т.е. служба каждую секунду что-то считает.
Но со временем приходит Stack Overflow. 
Как правильно сделать чтоб этого не было ? 

Если правильно понимаю, то это получается, что функция каждый раз ныряет все глубже и глубже. Не завершая предыдущие вызовы самой себя. Бесконечная рекурсия... Поэтому и захватывает все больше и больше памяти

 
Dmitiry Ananiev:

Запустил простенький скрипт как службу. 

Ну т.е. служба каждую секунду что-то считает.
Но со временем приходит Stack Overflow. 
Как правильно сделать чтоб этого не было ? 

OnStart()
{
   while(!_StopFlag) 
   {     
      //-------------------      
      //initialization area
      ...
      ...
      ...
 
   
      //-------------------
      //main cycle
      while(!_StopFlag && TerminalInfoInteger(TERMINAL_CONNECTED)) 
      { 
         
         //some code
         
         Sleep(1000);         
      }
      
      Sleep(3000);            
   }  

} 
 
Dmitiry Ananiev:

Запустил простенький скрипт как службу. 

Ну т.е. служба каждую секунду что-то считает.
Но со временем приходит Stack Overflow. 
Как правильно сделать чтоб этого не было ? 

У Вас бесконечная рекурсия получается. Естественно, через какое-то время стек заполняется.
 
Алексей Тарабанов #:

Есть два режима управления памятью: очередь и стек. 

А ещё есть стек процессора. Речь идёт именно о нём.

 
Koldun Zloy #:

А ещё есть стек процессора. Речь идёт именно о нём.

Да, конечно. Деликатность проявлял. 

Важно избегать рекурсивного вызова функции. 

Код рекурсивно вызывать не так критично. Главное - не увлекаться. 

 

Вообщем то все сделал, все работает, как я задумал. 

Но есть одно НО: 
В службах не работает OnTimer(). Приходится делать бесконечный цикл для постоянной работы. 

Так же не работает OnchartEvent().

int OnStart(void)
{
 while(true)
   {
      Sleep(1000);
      Print ("Test");  
 }
   return 0 ;
}

Вот такой скрипт службы  при остановке пишет  Abnormal termination, что несколько напрягает. 



 
Dmitiry Ananiev #:

Приходится делать бесконечный цикл для постоянной работы. 

Вот такой скрипт службы  при остановке пишет  Abnormal termination, что несколько напрягает. 

Судя по этим предложениям, ответы не читали.

Причина обращения: