Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Пользуйся функцией вставки контента из Кармана. Это удобно!
Андрей
1890
Андрей 2010.04.05 01:01 

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

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

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

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

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

Slawa
Модератор
6839
Slawa 2010.04.05 11:24  

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

Андрей
1890
Андрей 2010.04.05 20:04  
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 форум
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий