Возврат строки из DLL - страница 2

 
lusp:

static string res = "012345678901234567890... ...255 "; /// ну я не могу 255 сивмолов А вы сможете :-)

// и не надо ее динамически наращивать!

Все равно не помогает.

    if (!(IsOptimization() || IsTesting())) {
       string res = "0         1         2         3         4         5         6         7         8         9        10        11        12        13        14        15        16        17        18        19        20        21        22        23        24        25    5";
       string r1  = res;
       res = SaveRateM1(Rt);
       if (res != "OK")  {
         Print("StringLen(res)=",StringLen(r1), " result res= <",res,">");
       }  
       Sleep(100);
    }

Првда, чисто по ощущениям мусора стало меньше. Но он все равно есть


10:53:00 DllTest GBPCHF,M5: StringLen(res)=255 result res= <d.;EURJPY;2008.05.23 07:53;163.56;163.58;163.55;163.56;13>



--- проверьте DLL, отладку DLL проведите

--- например пишите из DLL в файл куда нибудь то что она возвращает

--- вы уверенны что DLL не возвращает мусор ?

 

YuraZ писал (а):

то есть если хотим передавать строки в эксперт из DLL то надо заранее проинициализировтаь строки максимальным значением типа

DLL:
 
EXP void __stdcall dllFunc(MqlStr* strArray, int n) {
  strcpy(strArray[0].string, "maximum 14 char");
  strcpy(strArray[1].string, "123");
}

А кусочка кода DLL на Delphi не найдется. А то как не пытаюсь реализовать эту конструкцию получаю стабильный трабл MT4

 
lusp:

YuraZ писал (а):

то есть если хотим передавать строки в эксперт из DLL то надо заранее проинициализировтаь строки максимальным значением типа

DLL:
 
EXP void __stdcall dllFunc(MqlStr* strArray, int n) {
  strcpy(strArray[0].string, "maximum 14 char");
  strcpy(strArray[1].string, "123");
}

А кусочка кода DLL на Delphi не найдется. А то как не пытаюсь реализовать эту конструкцию получаю стабильный трабл MT4

увы нету, не практикую Delphi...

 
lusp:

YuraZ писал (а):

то есть если хотим передавать строки в эксперт из DLL то надо заранее проинициализировтаь строки максимальным значением типа

DLL:
 
EXP void __stdcall dllFunc(MqlStr* strArray, int n) {
  strcpy(strArray[0].string, "maximum 14 char");
  strcpy(strArray[1].string, "123");
}

А кусочка кода DLL на Delphi не найдется. А то как не пытаюсь реализовать эту конструкцию получаю стабильный трабл MT4



посмотрите еще вот это



РАБОТА СО СТРОКАМИ

 

Заметил странную особенность:

Чем на большем количестве инструменов работает советник тем больше мусора получается.

если работает на 1-2 инструментаз мусора нет вообще.

на 4-х начинает появлятся

на 8 - практически каждую минуту

Счем это может быть связано ...

 
lusp:

Заметил странную особенность:

Чем на большем количестве инструменов работает советник тем больше мусора получается.

если работает на 1-2 инструментаз мусора нет вообще.

на 4-х начинает появлятся

на 8 - практически каждую минуту

Счем это может быть связано ...

стоит советник на разных парах ?


если на одной то для каждой пары попробуте свой массив

ResEURUSD = "..."

ResGBPJPY = "..." // 250 симовлов и т д



вообще явно что то не так, где то косяк

 
YuraZ:
lusp:

Заметил странную особенность:

Чем на большем количестве инструменов работает советник тем больше мусора получается.

если работает на 1-2 инструментаз мусора нет вообще.

на 4-х начинает появлятся

на 8 - практически каждую минуту

Счем это может быть связано ...

стоит советник на разных парах ?


если на одной то для каждой пары попробуте свой массив

ResEURUSD = "..."

ResGBPJPY = "..." // 250 симовлов и т д



вообще явно что то не так, где то косяк

Стоит на разных парах.

А про косяк понятно что он есть. А вот где он есть понять не могу

 
YuraZ:

--- проверьте DLL, отладку DLL проведите

--- например пишите из DLL в файл куда нибудь то что она возвращает

--- вы уверенны что DLL не возвращает мусор ?

Проверил из DLL возвращается 'ОК' всегда

 
lusp:

Првда, чисто по ощущениям мусора стало меньше. Но он все равно есть

10:53:00 DllTest GBPJPY,M1: StringLen(res)=255 result res= < 07:53;2.0400;2.0402;2.0388;2.0390;49>
10:53:00 DllTest GBPCHF,M5: StringLen(res)=255 result res= <d.;EURJPY;2008.05.23 07:53;163.56;163.58;163.55;163.56;13>
10:53:41 DllTest GBPJPY,M1: StringLen(res)=255 result res= <jdmiral Markets Ltd.;GBPJPY;2008.05.23 07:54;205.74;205.85;205.74;205.78;50>
10:54:47 DllTest GBPUSD,H1: StringLen(res)=255 result res= <M;Admiral Markets Ltd.;GBPCHF;2008.05.23 07:54;2.0389;2.0398;2.0389;2.0391;35>
 

Ребяты! сорри что влез, просто тоже беспокоит периодический мусор или точнее

сбой принимаемого файла при использовании wininet.dll

В цитате выше явно видно что мусор сыпется из ранних параметров:

AccountCompany(),";",

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

Именно при приёме файлов с длинными строками и возникают проблемы...

Чего нет и ещё ни разу не добился принимая файл строками не длинее 100 символов.

 

Кажется понял в чем дело.

Написал приложение, котрое имитирует работу советника на нескольких инструментах по вызову этой функции. Мусора нет.

Тогда я предположил что в МТ 4 не все ладно с многопоточностью. Если предположить что каждая пара работает в своем потоке и при передаче параметров они каким то образом перехлестываются, то все становится понятно с получением мусора. Пока один поток передает параметры, другой получает результат.

Тогда я ввел в советник семафор, который блокирует вызов функции из DLL, если она находится в обработке какой либо другой парой.

МУСОР ПРОПАЛ !!!. Уже 2 часа полет нормальный. При этом даже не надо заморачиваться с начальной инициализацией переменной в которую принимается результат.

Вот что в итоге получилось:

bool PassToLihtRed() {
  int varCount = GlobalVariablesTotal();
  for (int i = 0; i < varCount; i++) {
    if (StringFind(GlobalVariableName(i),PrefSemafor) >= 0) { 
       if (StringFind(GlobalVariableName(i),StringConcatenate(PrefSemafor,Symbol())) < 0) return(false); 
       return (true);     }
  }

  GlobalVariableSet(StringConcatenate(PrefSemafor,Symbol()), 1.0);
  return (true);       
}


bool DLLSemaforRed() {
  while (!IsStopped()) {
    if (PassToLihtRed() == true) return(true);
    Sleep(500);
  }
}


bool DLLSemaforGreen() {
  return (GlobalVariableDel(StringConcatenate(PrefSemafor,Symbol())));
} 


int start() {
  for (int i = 1; i < 61; i++) {
    datetime Tm = iTime(Symbol(),PERIOD_M1,1);
    string    Rt  = StringConcatenate("M",";",
                               AccountCompany(),";",
                               Symbol(),";",
                               TimeToStr(Tm,TIME_DATE)," ",TimeToStr(Tm,TIME_MINUTES),";",
                               DoubleToStr(iOpen  (Symbol(),PERIOD_M1,1),Digits),";",
                               DoubleToStr(iHigh  (Symbol(),PERIOD_M1,1),Digits),";",
                               DoubleToStr(iLow   (Symbol(),PERIOD_M1,1),Digits),";",
                               DoubleToStr(iClose (Symbol(),PERIOD_M1,1),Digits),";",
                               DoubleToStr(iVolume(Symbol(),PERIOD_M1,1),0)
                               );

    if (!(IsOptimization() || IsTesting())) {

       DLLSemaforRed();
       string res = SaveRateM1(Rt);
       DLLSemaforGreen();

       if (res != "OK")  {
         Print(" result res= <",res,">");
       }  
       Sleep(100);
    }   
  }  
  return(0);
}
Интересно мнение разработчиков по этому поводу
Причина обращения: