Ошибки, баги, вопросы - страница 2540
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Чего вы хотите?
чтобы в обсуждение багов и конструкций не лезли со своими комментами некомпетентные типа тебя, федосеева и т.д.
чтобы конструкции и механизмы взятые в MQL из С++ целиком и выглядящие так же как в С++ работали так же как в С++.
Чтобы MQL был полным аналогом С++ ?
И хватит уже ныть и пускать сопли пузырями по этому поводу. Я открыл для таких "обсуждений" отдельную тему.
ноешь как раз ты. про то как достали, про отдельный язык и про отдельную ветку.
открой для себя и сочувствующих отдельную ветку и ной там.
Как заставить терминал отпустить mqd-файл? Или еще лучше, если бы был штатный способ удаления из интерфейса?
Примерно догадываюсь, о чем вопрос. Лучше переформулировать.
Но while не успевает выйти из цикла, чтобы выполнить функции ниже, по дополнительному завершению всех остальных процессов.
И завершить саму функцию Fn().
Функция DestroyFunction(); выступает как проверочная в данном примере.
Содержание dll
Содержание программы Сервис.
Дополнительная задержка по флагу _StopFlag не помогает.
По моему есть проблема с деинициализацией dll в Сервисах, помогите разобраться.
длл выгружается не (обязательно) сразу после завершения сервиса (могу ошибаться)
в любом случае то что вы делаете при DLL_PROCESS_DETACH это уже поздно. Сделайте явную функцию deinit в длл которая будет выставлять этот флаг и явно вызываться при завершении сервиса.
Терминал начнет выгружать либу после возвращения потока из старт(), думаю. А то как получается? Программа работает, и начать ей окружение ломать? Ерунда ведь. Запустите в либе отдельный поток, а не гоняя в цикле поток скрипта, и вот его уже сможет нормально завершить.
Терминал начнет выгружать либу после возвращения потока из старт(), думаю. А то как получается? Программа работает, и начать ей окружение ломать? Ерунда ведь. Запустите в либе отдельный поток, и вот его уже сможет нормально завершить.
В том то и дело, что с потоками та же беда, и из за этого не могу корректно завершить другие процессы (потоки), у которых куча объектов которые нужно уничтожить.
По этому сделал простой пример, который выше чтобы проверить, и оказывается проблема совсем в другом.
Терминал не корректно работает с точкой выхода DLL_PROCESS_DETACH
Попробую как предложил TheXpert, но то что терминал выгружает dll сразу, не зависимо от DLL_PROCESS_DETACH, это наверно и есть ошибка терминала.
длл выгружается не (обязательно) сразу после завершения сервиса (могу ошибаться)
в любом случае то что вы делаете при DLL_PROCESS_DETACH это уже поздно. Сделайте явную функцию deinit в длл которая будет выставлять этот флаг и явно вызываться при завершении сервиса.
Спасибо за подсказку, попробую так сделать.
В том то и дело, что с потоками та же беда, и из за этого не могу корректно завершить другие процессы (потоки), у которых куча объектов которые нужно уничтожить.
По этому сделал простой пример, который выше чтобы проверить, и оказывается проблема совсем в другом.
Терминал не корректно работает с точкой выхода DLL_PROCESS_DETACH
Попробую как предложил TheXpert, но то что терминал выгружает dll сразу, не зависимо от DLL_PROCESS_DETACH, это наверно и есть ошибка терминала.
Спасибо за подсказку, попробую так сделать.
А с чего Вы взяли, что dll живет в отдельном потоке? У Вас банальное аварийное завершение работы программы, не обработанное в условиях цикла.
А DllMain запускается при подключении/отключении dll к процессу DLL_PROCESS и при создании/прекращении работы потока, созданного в этом процессе DLL_THREAD. Так что Ваш bool Detach, не факт, что и вообще существует внутри dll, ибо компилятор мог его и убрать в рамках оптимизации, так как в процессе исполнения всех функций во время жизни dll он не меняется и равен false.
А с чего Вы взяли, что dll живет в отдельном потоке? У Вас банальное аварийное завершение работы программы, не обработанное в условиях цикла.
А DllMain запускается при подключении/отключении dll к процессу DLL_PROCESS и при создании/прекращении работы потока, созданного в этом процессе DLL_THREAD. Так что Ваш bool Detach, не факт, что и вообще существует внутри dll, ибо компилятор мог его и убрать в рамках оптимизации, так как в процессе исполнения всех функций во время жизни dll он не меняется и равен false.
Не где не было сказано, что dll живёт в отдельном потоке.
Это мы с Vict общались, и друг друга поняли о чём речь ))
То что аварийное завершение это понятно, не понятно почему не срабатывает флаг в DLL_PROCESS_DETACH для выхода из цикла while.
А что касается DLL_THREAD, то они вообще не доступны для mql, об этом пишется в этой статье, проверял, действительно не работают.
А вот с компилятором VS как вариант, тоже может быть прикол.
Хотелось бы услышать пояснения компетентных представителей, а не гадать ))
По моему есть проблема с деинициализацией dll в Сервисах, помогите разобраться.
Но while не успевает выйти из цикла, чтобы выполнить функции ниже, по дополнительному завершению всех остальных процессов.
И завершить саму функцию Fn().
Функция DestroyFunction(); выступает как проверочная в данном примере.
Содержание dll
Содержание программы Сервис.
Дополнительная задержка по флагу _StopFlag не помогает.
О каком нормальном завершении может идти речь!
Если нужно подобное поведение, то внутри Fn в DLL необходимо запустить отдельный поток с циклом, который останавливать по флагу, который выставляется в отдельной функции FnStop и при DLL_PROCESS_DETACH