DLL в индикаторе работает, а советник выбивает - страница 2

 

int CatVector(double& a[] ...

А что у тебя представляет из себя double& a[]

Что это за массив? Таймсерии? И ещё у тебя вылетает сразу же или про прошествии какого-то времени?

Попробуй тот же код вызвать в скрипте если там не будет падать значит вероятно и правда длительный расчёт не навится эксперту он требует возврата из функции start через какое-то время. Хотя по документации к мт4 вроде и нет таких ограничений на выполнение функции start Но мне кажется что длительное выполнение нарушает работу или идёт принудительный возврат из старт. Если у тебя будет работать в скрипте - значит ты прав что эксперту не нравится что ты что то долго расчитываешь.

 

double& a[] - это одномерный массив цен.

В индюке никаких проблем. Работает нормально.

 

Попробуй вызывать в скрипте свою функцию и скажи так же без проблем работает как и в индикаторе?

Если тоже будет валится то напиши как ты таймсерии передаёшь? Случаем не таким ли способом

double a[][6];

ArrayCopyRates(a, ...

DLLFunc(a, ...

Если так то здесь могут быть проблемы. К примеру если ты делаешь в

init() {

ArrayCopyRates(a, ...

}

а в

strart() {

DLLFunc(a, ...

}

то в этом случае у тебя мт4 упадёт либо сразу либо спустя какое-то время потому что указатель на массивы таймсерий может поменятся а ты в dll продолжать будешь использовать старый указатель (ссылку если в MQL коде). У меня была такая проблема и нашёл только отлавливая системные исключения access violation и локализовал место падения. Возможно у тебя такая же проблема. В индикаторе ты не сможешь в init передать в функцию dll таймсерии и количество баров.

Если ты таким способом передаёшь массив таймсерий то попробуй так

double a[][6];

start() {

ArrayCopyRates(a, ...

DLLFunc(a, ...

}

Естественно вместо DllFunc у тебя будет другое имя функции но принцип тот же.

 
stringo писал(а) >>

Есть нюанс. Индикатор работает в интерфейсном потоке, который существует всегда. А эксперты и скрипты работают в специально создаваемом потоке. Поток создаётся перед запуском эксперта, а потом убивается.

Обратите внимание на то, как в Вашей dll обрабатывается thread detach

stringo, не могли бы вы написать как именно надо обрабатывать сообщение DLL_THREAD_DETACH что бы dll не выгружалась после каждого тика из советника. У Дж. Рихтера сказано что "... Заметьте, что DLL может не дать потоку завершиться. Например, такое возможно, когда функция DllMain, получив уведомление DLL_THREAD_DETACH, входит в бесконечный цикл. " Ни это ли имелось ввиду. Если да, то приведите пример кода пожалуйста. Очень нужно. Моя dll достаточно долго загружает вспомогательные библиотеки и это критично для моей системы, как выйти из этой ситуации не знаю, вижу только один путь не дать dll выгружаться.

 

Нашел другой путь решения проблемы через обмен данными между процессами с помощью файлов отображаемых в память. Организую "канал связи" между процессами внутри dll-ки с помощью общей виртуальной памяти. Прикручиваю dll к индикатору (это принципиально), индикатор является поставщиком данных в dll. Подсоединяю советника к "каналу связи" на каждом тике, т.е. советник просто забирает информацию из dll, при этом dll постоянно загружена так как подключена к индикатору. Всё. "Дёшево и сердито" :-)

Спасибо ВСЕМ кто ответил.

 
dr_Dim >>:

Нашел другой путь решения проблемы через обмен данными между процессами с помощью файлов отображаемых в память. Организую "канал связи" между процессами внутри dll-ки с помощью общей виртуальной памяти. Прикручиваю dll к индикатору (это принципиально), индикатор является поставщиком данных в dll. Подсоединяю советника к "каналу связи" на каждом тике, т.е. советник просто забирает информацию из dll, при этом dll постоянно загружена так как подключена к индикатору. Всё. "Дёшево и сердито" :-)

Спасибо ВСЕМ кто ответил.

А можешь выложить сюда код DLL? Хочется посмотреть пример, как создавать DLL под DELPHI для MetaTrader.