Dll не выгружается после остановки советника.

 
После того, как советник выгружается из памяти - сама библиотека не выгружается. Не вызывается функция DllMain с ul_reason_for_call равным DLL_PROCESS_DETACH. Так и должно быть?
 

Такое поведение означает, что DLL все еще используется. Ищите другие индикаторы/советники/программы, вызывающие функции этой DLL.

Также DLL не выгружается, пока открыто окно тестера (в МТ4), если проводился тест советника, использующего DLL.

 
Ihor Herasko #:

Такое поведение означает, что DLL все еще используется. Ищите другие индикаторы/советники/программы, вызывающие функции этой DLL.

Также DLL не выгружается, пока открыто окно тестера (в МТ4), если проводился тест советника, использующего DLL.

dll не используется. Других советников, использующих dll нет. Скорее всего, dll намерено не выгружает терминал что бы не подгружать его при повторном использовании. 

(в МТ4)

Кто то еще использует MT4? )

 
DrSky #:

dll не используется. Других советников, использующих dll нет. Скорее всего, dll намерено не выгружает терминал что бы не подгружать его при повторном использовании. 

(в МТ4)

Кто то еще использует MT4? )

Уточните все-таки: это происходит после тестирования или после удаления советника с онлайн-графика?

 
Ihor Herasko #:

Уточните все-таки: это происходит после тестирования или после удаления советника с онлайн-графика?

С онлайн графика. В тестировании dll не участвует. В принципе, уже все равно, добавил watchdog таймер. Если советник перестает забирать данные - поток в dll прерывается.

 
DrSky #:

С онлайн графика. В тестировании dll не участвует. В принципе, уже все равно, добавил watchdog таймер. Если советник перестает забирать данные - поток в dll прерывается.

Так вот же и ответ: в DLL создан поток (Thread?). Если его никто не прервал, то DLL и не выгрузится. Отправляйте из OnDeinit() советника команду окончания работы в DLL. А в DLL завершайте все созданные потоки по этой команде.

 
Ihor Herasko #:

Так вот же и ответ: в DLL создан поток (Thread?). Если его никто не прервал, то DLL и не выгрузится. Отправляйте из OnDeinit() советника команду окончания работы в DLL. А в DLL завершайте все созданные потоки по этой команде.

Разумеется, при нормальном завершении работы советника вызываются методы завершения всех потоков и производится удаление созданых объектов (но даже в этом случае не вызывается detach). Но советник может вылетать не только штатно, но и не штатно, например, при обращении к нулевому указателю. Обычно, когда по любой причине умирает процесс использующий DLL и иные процессы ее не используют - она выгружается из памяти вызывая detach (но может отсаваться в кеше). В данном же случае, dll цепляется к процессу терминала, и не важно, использует советник dll или нет - она не будет выгружена. Именно по этому, при выбросе и не перехвате исключения или acess violation - DLL за собой вызывает краш терминала.

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