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

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

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

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

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

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

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

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

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

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

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

 

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

 

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

 

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

 

Хорошо бы.

 
Продолжаем разговор..

Запустите этот скрипт.
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
#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 , находится в функции, подчинённой старту.
Кроме того, вся эта чехарда оказывается чувствительной к наличию циклов.

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

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

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

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

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

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

 

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

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

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

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

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