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

 

Кто может помочь с проблемой?

DLL написаная на Delphi нормально работает в индикаторе. При этом тот-же вызов из советника выбивает МТ полностью.

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

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


Там всего одна функция, перепутать сложно. По параметрам выбивает немедленно, а тут иногда работает пару тиков.

Предполагаю, что МТ все-таки не нравится длительность обработки, но как обойти.

 

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

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

 

thread detach Что за зверь такой? Он у меня никак не обрабатывается

ДЛЛ получает от МТ

int CatVector(double& a[] , int plag , int pNumberGK ,int predict , int cnt ) ;

Обращается к другой ДЛЛ, которая производит обработку массива и возвращает в нем результат.

Предполагаю, что срабатывает именно Ваш нюанс и при убиении потока выгружается и ДЛЛ, которая используется индикаторами.

Что Вы называете запуском? Инициализацию эксперта или потиковую работу?

 

Каждая dll имеет функцию DllMain, которая вызывается в 4 случаях

BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
  {
//----
   switch(ul_reason_for_call)
     {
      case DLL_PROCESS_ATTACH:
      case DLL_THREAD_ATTACH:
      case DLL_THREAD_DETACH:
      case DLL_PROCESS_DETACH:
         break;
     }
//----
   return(TRUE);
  }
Эти случаи перечислены выше. В приведённом примере (это из нашей DllSample) нет никакой обработки. А в принципе, если в dll используется thread local storage (TLS), то при thread detach эта память должна освобождаться, а при thread attach (то есть при следующем запуске, при приходе следующего тика) в эту память нельзя обратиться, пока по новой не распределишь её.
 

А может быть при закрытии чарта перекомпиляции смене таймфрема просто выгружать длл вызывая FreeLibrary. В этом случае всегда можно, убрав просто эксперта с чарта или закрыв чарт скомпилировать новую версию DLL пеерписав поверх сущесвющей в директории MT4. А сейчас это зачастую не возможно пока не закроешь полностью MT4.

А логопеду надо учитывать что в

case DLL_THREAD_DETACH:

или в эксперте в функции

deinit()

следует вызывать функцию DLL которая будет освобожать память выделеную для классов в Delphi с помощью Free

иначе тоже может валится весь MT4 из-за DLL


 
stringo:

Каждая dll имеет функцию DllMain, которая вызывается в 4 случаях

BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
  {
//----
   switch(ul_reason_for_call)
     {
      case DLL_PROCESS_ATTACH:
      case DLL_THREAD_ATTACH:
      case DLL_THREAD_DETACH:
      case DLL_PROCESS_DETACH:
         break;
     }
//----
   return(TRUE);
  }
Эти случаи перечислены выше. В приведённом примере (это из нашей DllSample) нет никакой обработки. А в принципе, если в dll используется thread local storage (TLS), то при thread detach эта память должна освобождаться, а при thread attach (то есть при следующем запуске, при приходе следующего тика) в эту память нельзя обратиться, пока по новой не распределишь её.
//Главная DLL-функция
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
//----
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
//----
return(TRUE);
}

Это кусок кода из statistik.dll в статье про отбор ДЦ.

Если у товарища работало в индикаторе, то у него однозначно инициализация была в init(), а не в start (). Таким образом, деаттача на новом тике быть не должно.

И тут же вопрос к stringo - чем является эксперт и чем является индикаторор - нитями? Хотелось бы подробно узнать об этом, потому что при интегрировании Mt4 через dll в разные приложения это важно. Опытным путем установлено, что все эксперты грузят одну копию dll, то есть работают в рамках одного процесса, но вот чем они конкретно ялвяются с точки зрения операционной системы?
 
Каждый эксперт работает в отдельном запускаемом для него потоке (thread). Индикаторы работают в потоке вызывающего. Если индикатор на графике, то он работает в общем интерфейсном потоке программы, а если индикатор вызывается из эксперта, то работает в потоке эксперта.
 

Спасибо за советы, но я пока поступил проще.

Создал копию ДЛЛ с другим именем и обращаюсь из советника к ней. Два часа полет нормальный

 
logoped:

Спасибо за советы, но я пока поступил проще.

Создал копию ДЛЛ с другим именем и обращаюсь из советника к ней. Два часа полет нормальный

Моя ошибка полет ненормальный, опять выбивает.

Другая идея разбить обсчет на 3 части загрузку, флаг и выгрузку. И тогда такой вопрос по работе советника.

Когда его прерывают по времени выполнения, куда он возвращается опять на старт или в точку прерывания?

И если можно варианты для рабочего и тестового режима.