MQL4 - automated forex trading   /  

Форум

Некорректное завершение работы эксперта.

К списку тем  | 1 2 3 Авторизуйтесь или зарегистрируйтесь, чтобы создать новую тему

avatar
314
SKif 27.04.2006 21:02 
Разработчикам.
#include <WinUser32.mqh> int start() { MessageBox( "Выгрузите советник из окна, не нажимая ОК.", "Ситуация", MB_OK|MB_ICONSTOP|MB_TOPMOST); return(0); }

Прикрепить к окну и запустить этот эксперт.
Когда появится МВ не нажимать ОК, а средствами МТ (пр. кнопка мыши>Советники>Удалить) удалить эксперт.

Теперь попробуйте прикрепить к окну любой другой эксперт.
На моём ПК эксперты в это окно не прикрепляются и не работают. Лечится выгрузкой-загрузкой МТ.
article

Оборудование для Чемпионата Automated Trading Championship 2006

Сегодня в офис MetaQuotes Software Corp. был доставлен блейд сервер PowerEdge 1855 стоимостью 35 000 долларов. Сервер был заказан в компании Dell (США) и в течение полутора месяцев добирался до своего места здесь, в Казани.


avatar
Модератор
5089
stringo 28.04.2006 15:17 
Спасибо. Исправили

avatar
314
SKif 28.04.2006 15:20 
Спасибо.
Теперь я не буду переделывать код.

avatar
4818
SK. 08.05.2006 19:43 

Похоже, что этим проблема не исчерпывается.

Если в старт() скрипта используется ф-ия Фун(), сожержащая МВ, и

в деинит() используется та же ф-ия Фун(), и

при выгрузке скрипта (при активном МВ) из старта() управление штатно передаётся в деинит(), где активируется та же Фун(),

то Фун() стартовая и Фун() деинитовая перебрасывают друг другу управление с последующим зависанием МТ.

Во всяком случае, я понял это так. Билд 193 от 03.05.06.

Дабы не загружать форум могу выслать разработчикам не вычещенный до девственной проблемы код (несколько файлов по 20-30 строк).


avatar
Модератор
5089
stringo 09.05.2006 10:40 

А вот эту проблему уже не решить, так как мы не управляем окнами MessageBox. Нам недоступен хэндл этого окна.


avatar
4818
SK. 09.05.2006 12:51 

ОК. Не всё коту масленица.


avatar
Модератор
5089
stringo 09.05.2006 14:48 

Мы подумаем, что можно сделать


avatar
4818
SK. 09.05.2006 15:23 

Хорошо бы.


avatar
4818
SK. 02.06.2006 20:23 
Продолжаем разговор..

Запустите этот скрипт.
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
#include <WinUser32.mqh>
int Fishka; 
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
//
// 
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
int init()  
   {
   Alert("Metka 1");
   Fishka=1;                                               
   return;
   }
//============================================================================================
int start()  
   {
   Alert("Metka 2");
   Fishka=2;                                                 
   while(1==1)
      {
      My_Function();                                         
      Sleep(300);
      }
   return;
   }
//============================================================================================
int deinit() 
   {
   Alert("Metka 3");
   Fishka=3;                                                     
   return;
   }
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж Конец модуля жжжжжжжжжжжжжжжжжжжжжжжжжжжжж
//
//
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
int My_Function()
   {
   Alert("Fishka = ",Fishka);
   while (Fishka ==2) 
      {
      MessageBox( "Выгрузите скрипт, не закрывая MessageBox",
                  "Проблема", MB_OK|MB_ICONSTOP|MB_TOPMOST  );
      Sleep(300);
      }
   return;
   }
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж Конец модуля жжжжжжжжжжжжжжжжжжжжжжжжжжжжж

Дождитесь полного завершения (заливка окон белым, подвисание) выгрузки скрипта.
Я никак не могу объяснить вот это:



Обратите внимание, Алерт, печатающий Fishka = 3 , находится в функции, подчинённой старту.
Кроме того, вся эта чехарда оказывается чувствительной к наличию циклов.

Моих мозгов не достаточно чтобы всё это осягнуть, может быть вы что-то сможете сказать или сделать.

Совет полностью отказаться от использования МВ будет воспринят как содержательный.
(Затормозился я на этом месте, готов уже решать задачу отображения текста граф. средствами)

avatar
4818
SK. 03.06.2006 17:44 

Или я совсем из ума выжил или..

Сегодня продолжал бороться с проблемой. Дело оказалось не в МВ, а в алгоритме выхода из скрипта, в кот. зациклен старт.
При принудительной выгрузке такого скрипта он "подвисает" на отведенные ему 2,5 сек., но потом в алерте отписывает ещё 25 (!) строк прогона стартового цикла, причём это наверняка не ошибка алерта (я поставил счётчик, кот. успешно накапливает). Интересно к тому же, что стартовый Sleep(1000) при этом игнорируется.

Если можно, проясните, пожалуйста, что тут к чему..
И в связи с этим вопрос:
Как вообще задуман алгоритм принудительной выгрузки зацикленного скрипта (эксперта)?
Предположим, скрипт содержит 100 строк, указание на выгрузку настигло его на 30-й строке кода. Должен ли такой скрипт (по идее) всё бросить в старте "как есть" и перейти в deinit()? Или он должен доработать .. до чего?.. ведь стартовый return в таком цикле не достигается..

(в предыдущем сообщени показано, что "доработка" старта происходит после того, как управление уже коснулось деинита. .:)


avatar
Модератор
5089
stringo 05.06.2006 12:31 

у эксперта есть 2 внутренних флага - stopflag и cancelflag. Функция Sleep не работает, когда хотя бы один из флагов взведён.

На stopflag реагирует функция IsStopped

cancelflag проверяется в конце каждого цикла и после вызова каждой функции.

Сначала выставляется stopflag. Если за 2.5 секунды после его выставления программа не закончилась (не было проверок IsStopped, либо программа сама по себе не завершилась) то выставляется cancelflag. Если за 2. 5 секунды программа не завершила свою работу (висела какая-нибудь dll-ская функция), то поток выполнения программы прибивается насильственно.

К списку тем   | 1 2 3  

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий