Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Candid
1630
Candid 2010.10.02 11:44 

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

  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

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

Aleksandr Chugunov
4832
Aleksandr Chugunov 2010.10.02 11:51  

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

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

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

Candid
1630
Candid 2010.10.02 12:04  
AlexSTAL:

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

bool IsStopped( )

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

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

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

Vadim Zhunko
5226
Vadim Zhunko 2010.10.02 12:12  

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

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

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

Candid
1630
Candid 2010.10.02 12:14  
Zhunko:

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

А я уже исправил. Но всё равно спасибо :)
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий