Что же должен делать MetaTrader 5 при выходе?

 

Я столкнулся со странной проблемой.

Я создаю DLL, которая при загрузке из индикатора или скрипта, создает свой GUI-поток и окошки. Создание потока- это вполне валидная операция- собственно, иначе GUI не будет работать. Вопрос в том, что в некоторых случаях DLL загружает большое количество данных- или оказывается не привязанной к конкретному индикатору или скрипту- тогда имеет смысл сделать DLL "невыгружаемой". Реализация "невыгружаемости" достаточно простая- при загрузке (process attach) DLL загружает саму себя еще раз.

Я заметил, что DLL, работавшая на MT4, вдруг отказалась работать с MT5. Вызов Process Detach от MT5 приводил к тому, что цикл ожидания выхода из GUI thread в моей DLL оказывался бесконечным.

Оказалось, что MT5 при выходе из приложения... производит весьма оригинальное действие- он убивает сначала мой поток- потом окно. При этом, естественно, пользователь не может ничего сохранить (поскольку окно не получает сообщения на закрытие), DLL не может нормально выгрузится.

Нельзя ли попросить у уважаемых разработчиков комментариев относительно целей, которые они преследовали при написании столь варварской процедуры деинициализации? Можно ли ожидать, что поведение программы станет более стандартным? 

 

Дайте, пожалуйста, простейшую dll, чтобы мы могли понять проблему. Простейшую - это такую, в которой оставлена только та функциональность, которая иллюстрирует проблему.

 
stringo писал(а)  :

Дайте, пожалуйста, простейшую dll, чтобы мы могли понять проблему. Простейшую - это такую, в которой оставлена только та функциональность, которая иллюстрирует проблему.

Уважаемый stringo, спасибо за ответ. К сожалению, я немного поспешил с выводами.

Оказалось, что в МТ4 происходит вещь аналогичная. Т.е. при выходе из процесса на момент вызова в Dll функции DllMain с параметром PROCESS_DETACH, уже и созданный поток уничтожен- и окно. Единственным отличием у МТ4 было то, что почему-то terminal.exe не оставался в списке процессов- и поэтому у меня было основание думать, что GUI поток "ложится" gracefully- и я рассчитывал, что таким образом я получаю возможность сохранять/не сохранять данные.

Т.е. получается такая ситуация, что поскольку МТ не знает ничего о дополнительных окнах в его процессе, он не посылает им при закрытии WM_CLOSE... и поэтому при выходе из процесса- окна и их потоки прибиваются системой.

Возможный выход из ситуации- это либо перехватывать сообщение главного окна MT на закрытие- и пытаться выйти...

или ждать от вас, разработчиков, какой-то подсказки. Возможно... стоило бы искать в User Dll какую-то функцию типа bool CanExit()... которая могла бы даже отказать в закрытии метатрейдера. Или она бы ждала полной нормальной деинициализации всех Gui- потоков, если такие есть...

Самую простую Dll сделать, к сожалению, не смог /на Dll с Gui потоком у меня ушло где-то с неделю- но она привязана к библиотеке кода, с компиляцией есть некоторые нюансы/. Приложил бинарную Dll, которая просто показывает окно.

DbgView при этом показывает, что при закрытии окна крестиком в логе будет строка "Exiting GUI Thread". При закрытии метатрейдера в логе фиксируются надписи "GUI Thread is DEAD" / "IsWindow() = false" - это означает, что поток и окно были разрушены.

P.S.: Моё мнение по поводу Custom GUI Forms /я постил видео на mql4, https://www.mql5.com/ru/forum/120805/- такое, что эта тема может быть весьма интересной. Поэтому, возможно, стоило бы придумать хорошее решение по деинициализации /а возможно, и по загрузке Dll при старте MT.../. Могу написать интересную статью...

Новый способ работы с индикаторами - MQL4 форум
  • www.mql5.com
Новый способ работы с индикаторами - MQL4 форум
Причина обращения: