Это баг или так задумано?

 

Пишем программку на MQL4.
Как известно, при перекомпилировании программы вызывается функция deinit(), на которую отводится максимум 2,5 секунды.
Допустим, у нас вызвалась deinit() и UninitializeReason() сказала нам REASON_RECOMPILE. В этом случае нам необходимо выполнить некоторую функцию DoWork(), вызываем её. При этом функция DoWork() не всегда работает до конца и deinit() тут же прерывается (даже если после DoWork() что то есть).

Рассмотрим пример:

...
//+------------------------------------------------------------------+
int deinit()
  {
//----
   if(REASON_RECOMPILE == UninitializeReason())
      {
         Print("Deinit_pre");
         DoWork();
         Print("Deinit_after");         
      }
   Print("Deinit_all");
//----
   return(0);
  }  
//+------------------------------------------------------------------+
void DoWork()
   {
//----
   Print("In_DoWork_function");
//----
   }
//+------------------------------------------------------------------+
...

Запускаем. Затем перекомпилируем.
Я ожидаю увидеть следующее: "Deinit_pre", "In_DoWork_function", "Deinit_after", "Deinit_all", "deinitialized"
В итоге получаю: "Deinit_pre", "In_DoWork_function", "deinitialized"

Как так получается? Может быть я что то не так делаю?

P.S. Выполнение функции DoWork() в моей ситуации критически важно.

 
А почему не приводите тайминг, который отображается в логах?
Сделайте DoWork пустым и проверьте снова.
 
Кусок лога (DoWork() имеет код):
2006.08.14 17:50:03 exp2 EURUSD,M1: initialized
2006.08.14 17:50:03 exp2 EURUSD,M1: Init
2006.08.14 17:50:03 exp2 EURUSD,M1: loaded successfully
2006.08.14 17:50:03 exp2 EURUSD,M1: deinitialized
2006.08.14 17:50:03 exp2 EURUSD,M1: In_DoWork_function
2006.08.14 17:50:03 exp2 EURUSD,M1: Deinit_pre
2006.08.14 17:50:03 Compiling 'exp2'

Кусок лога (DoWork() пустая):
2006.08.14 17:52:11 exp2 EURUSD,M1: initialized
2006.08.14 17:52:11 exp2 EURUSD,M1: Init
2006.08.14 17:52:11 exp2 EURUSD,M1: loaded successfully
2006.08.14 17:52:11 exp2 EURUSD,M1: deinitialized
2006.08.14 17:52:11 exp2 EURUSD,M1: In_DoWork_function
2006.08.14 17:52:11 exp2 EURUSD,M1: Deinit_pre
2006.08.14 17:52:11 Compiling 'exp2'

Для полноты, так сказать:
//+------------------------------------------------------------------+
//|                                                         exp2.mq4 |
//|                                                              qwe |
//|                                                              qwe |
//+------------------------------------------------------------------+
#property copyright "qwe"
#property link      "qwe"
 
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   Print("Init");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   if(REASON_RECOMPILE == UninitializeReason())
      {
         Print("Deinit_pre");
         DoWork();
         Print("Deinit_after");         
      }
   Print("Deinit_all");
//----
   return(0);
  }  
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----  
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
void DoWork()
   {
//----
   Print("In_DoWork_function");
//----
   }
//+------------------------------------------------------------------+
 
Я запустил на 195 билде (эксперт, на фоне которого запускается перекомпиляция).

Читается снизу вверх:

2006.08.14 18:08:20 dowork2 GBPUSD,H1: initialized
2006.08.14 18:08:20 dowork2 GBPUSD,H1: Init
2006.08.14 18:08:20 dowork2 GBPUSD,H1: loaded successfully
2006.08.14 18:08:20 dowork2 GBPUSD,H1: deinitialized
2006.08.14 18:08:20 dowork2 GBPUSD,H1: Deinit_all
2006.08.14 18:08:20 dowork2 GBPUSD,H1: Deinit_after
2006.08.14 18:08:20 dowork2 GBPUSD,H1: In_DoWork_function
2006.08.14 18:08:20 dowork2 GBPUSD,H1: Deinit_pre

Все нормально, сработало так как и должно было. Какой у Вас билд терминала?
 

У меня 195 билд.
Тем не менее лог у меня выглядит так ("читается снизу вверх" :) ):

2006.08.15 13:38:59 exp2 EURUSD,M1: initialized
2006.08.15 13:38:59 exp2 EURUSD,M1: Init
2006.08.15 13:38:59 exp2 EURUSD,M1: loaded successfully
2006.08.15 13:38:59 exp2 EURUSD,M1: deinitialized
2006.08.15 13:38:59 exp2 EURUSD,M1: In_DoWork_function
2006.08.15 13:38:59 exp2 EURUSD,M1: Deinit_pre
2006.08.15 13:38:59 Compiling 'exp2'
2006.08.15 13:38:42 exp2 EURUSD,M1: initialized
2006.08.15 13:38:42 exp2 EURUSD,M1: Init
2006.08.15 13:38:42 exp2 EURUSD,M1: loaded successfully

 
Странно. Скачайте вчерашний билд 195 ( http://www.metatrader4.com/files/mt4setup.exe 3Mb) и попробуйте снова, пожалуйста. Останется ли такое же поведение?
 

Теперь все стало нормально, спасибо.

2006.08.15 16:11:29 exp2 EURUSD,H4: initialized
2006.08.15 16:11:29 exp2 EURUSD,H4: Init
2006.08.15 16:11:29 exp2 EURUSD,H4: loaded successfully
2006.08.15 16:11:29 exp2 EURUSD,H4: deinitialized
2006.08.15 16:11:29 exp2 EURUSD,H4: Deinit_all
2006.08.15 16:11:29 exp2 EURUSD,H4: Deinit_after
2006.08.15 16:11:29 exp2 EURUSD,H4: In_DoWork_function
2006.08.15 16:11:29 exp2 EURUSD,H4: Deinit_pre
2006.08.15 16:11:28 Compiling 'exp2'
2006.08.15 16:10:02 exp2 EURUSD,H4: initialized
2006.08.15 16:10:02 exp2 EURUSD,H4: Init
2006.08.15 16:10:01 exp2 EURUSD,H4: loaded successfully