Проблема при остановке тестирования советника с dll

 

Есть советник, использующий dll.

Работает корректно и в живую, и в тестере, и при оптимизации на нескольких агентах параллельно.

Однако, если остановить тестер до окончания теста, то возникает странная ситуация.

1) Вызова DllMain с параметром DLL_PRICESS_DETACH при остановке не происходит.

2) Если после этого запустить тестер еще раз, то сам тестер бесконечно пытается получить доступ к агенту.

Журнал окна «Тестер стратегий»:

Лог самого агента тестирования. Остановка:

EH 0          22:58:08.909    Tester  shutdown tester machine

QI  0          22:58:08.910    Tester  1 of 17 passes processed in 0:00:00.078

GS 0          22:58:08.910    Tester  try to cancel expert execution

IK  0          22:58:08.911    Tester  expert execution canceled

GM            0          22:58:08.912   Tester  tester process stopped

RJ  0          22:58:08.913    Tester  tester agent shutdown finished

Повторный запуск:

CR 0          22:58:20.354    127.0.0.1         login (build 1881)

PE  0          22:58:20.361    Tester  account info found with currency USD

CN 0          22:58:20.370    Network          1482 bytes of tester parameters loaded

MJ 0          22:58:20.370    Network          14524 bytes of input parameters loaded

QN 0          22:58:20.370    Tester  expert file added: Experts\ХХХХХХ.ex5. 156648 bytes loaded

FQ 2          22:58:20.370    Tester  file Libraries\my_library.dll write error [32]

GE 2          22:58:20.370    Tester  requested data synchronization error

KN 3          22:58:20.372    Network          additional connect from 127.0.0.1

KG 3          22:58:20.472    Network          previous connect context not freed

RM 2          22:58:20.472    127.0.0.1         cannot accept connect, agent is busy

FK 3          22:58:21.374    Network          additional connect from 127.0.0.1

RS 3          22:58:21.474    Network          previous connect context not freed

Видна неудачная попытка копирования файла dll в папку тестера (файл занят процессом тестера).

Последние три строчки повторяются по кругу.

 

3)      Если просто подождать 5 минут, то процесс metatester самостоятельно завершается, происходит вызов DllMain с параметром DLL_PRICESS_DETACH. После этого запуск тестера проходит успешно.

4)      Если завершить процесс «metatester» через диспетчер задач, то вызова DllMain при этом не происходит, но файл dll освобождается и после этого запуск тестера также проходит успешно.

 

Что может быть причиной такого поведения?

Повторяется ли это у кого-нибудь на других советниках, использующих dll?

 

Я столкнулся с такой же проблемой: https://www.mql5.com/en/forum/315144

Создал поток, в который по таймеру шлю сообщения. Если поток не получает сообщения спустя некоторое время, он убивает процесс. Проблема решилась, хотя такая схема убивает визуальный тестер на паузе (опционально отключаю кипэлайв таймер, если эксперт работает в визуальном режиме).

Release file on force backtest stop
Release file on force backtest stop
  • 2019.06.05
  • www.mql5.com
I am using sqlite database in my EA. When I force stop backtest process agent hangs and never accepts new jobs until I restart MetaTrader...
 
Смотри. Пока файл dll отображен в адрессное пространство любого процесса, ОС не даст, что-либо сделать с файлом dll (у тебя копирование). Если процесс metatester не завершен, то смотри выше.
 

Проблема есть, но у меня ДЛЛка сложная, поэтому мне проще убивать процесс.

Если есть простая ДЛЛка для теста, то лучше оформить это в виде бага. Пускай @Renat Fatkhullin и @Slava решают проблему.

 

Что может быть причиной такого поведения?

Повторяется ли это у кого-нибудь на других советниках, использующих dll?

могут быть странные действия внутри DllMain. Там внутри не всё и не всегда можно использовать. Её вообще лучше не использовать и не трогать, если внутри почти только математика и без тонких системных нюансов. В 90% её стоит выбрасывать из кода.

обратить пристальное внимание на то что работает multithread - потоков исполнения много и можно заплутать в статической памяти.

мелкий хинт, про который мало знают: если сама DLL отлажена вдоль и поперёк, то имеет смысл закреплять её в памяти, предотвращая излишние выгрузки/загрузки.