Как-то странно зацикленные скрипты снимаются

 

Берём простейший код:

  while(true) {
    Print("Test");
    Sleep(1000*60);
  }

- запускаем его и через некоторое время пытаемся снять. Почему-то прежде чем остановиться скрипт судорожно отпечатывает в лог слово Test ещё 25 раз.

2010.10.02 13:34:37 Test EURUSD,M1: removed
2010.10.02 13:34:37 Test EURUSD,M1: uninit reason 1
2010.10.02 13:34:37 Test EURUSD,M1: shutdown by timeout
2010.10.02 13:34:37 Test EURUSD,M1: Test
2010.10.02 13:34:37 Test EURUSD,M1: Test
2010.10.02 13:34:36 Test EURUSD,M1: Test
2010.10.02 13:34:36 Test EURUSD,M1: Test
2010.10.02 13:34:36 Test EURUSD,M1: Test
2010.10.02 13:34:36 Test EURUSD,M1: Test
2010.10.02 13:34:36 Test EURUSD,M1: Test
2010.10.02 13:34:36 Test EURUSD,M1: Test
2010.10.02 13:34:36 Test EURUSD,M1: Test
2010.10.02 13:34:36 Test EURUSD,M1: Test
2010.10.02 13:34:36 Test EURUSD,M1: Test
2010.10.02 13:34:36 Test EURUSD,M1: Test
2010.10.02 13:34:35 Test EURUSD,M1: Test
2010.10.02 13:34:35 Test EURUSD,M1: Test
2010.10.02 13:34:35 Test EURUSD,M1: Test
2010.10.02 13:34:35 Test EURUSD,M1: Test
2010.10.02 13:34:35 Test EURUSD,M1: Test
2010.10.02 13:34:35 Test EURUSD,M1: Test
2010.10.02 13:34:35 Test EURUSD,M1: Test
2010.10.02 13:34:35 Test EURUSD,M1: Test
2010.10.02 13:34:35 Test EURUSD,M1: Test
2010.10.02 13:34:35 Test EURUSD,M1: Test
2010.10.02 13:34:34 Test EURUSD,M1: Test
2010.10.02 13:34:34 Test EURUSD,M1: Test
2010.10.02 13:34:34 Test EURUSD,M1: Test
2010.10.02 13:34:07 Test EURUSD,M1: Test
2010.10.02 13:34:07 Test EURUSD,M1: loaded successfully

Кстати, из контекстного меню он почему-то никогда с первого раза не снимается. А вот печатать начинает с первого раза.

 

shutdown by timeout - Вы его снимаете в аварийном режиме....

добавьте в цикл проверку

bool IsStopped( )
Возвращается TRUE, если программа (эксперт или скрипт) получила команду на завершение своей работы, иначе возвращает FALSE. Программа может работать еще 2.5 секунды прежде, чем клиентский терминал принудительно завершит ее выполнение.

 
AlexSTAL:

добавьте в цикл проверку

bool IsStopped( )

Да, такой вариант лишён недостатков предыдущего, спасибо.

while(!IsStopped()) {
  Print("Test");
  Sleep(1000*60);
}

Но всё равно, как на мой вкус, команда с IsStopped( ) выглядит не слишком логично. Я же не против, чтобы скрипт ещё какое-то время поработал. Мне всего-то нужно чтобы он делал это корректно и снимался с первого раза, пусть и с задержкой. Впрочем это так, побрюзжать :) . Понятно что разработчики ничего на эту тему делать не будут.

 

Так красивее будет:

while(!IsStopped())
 {
  Print("Test");
  Sleep(1000*60);
 }

 У меня скипты и эксперты с вложенными циклами выгружаются моментально. Надо только такую функцию в условие цикла поставить.

 
Zhunko:

Так красивее будет:

А я уже исправил. Но всё равно спасибо :)