Обсуждение статьи "Связь с MetaTrader 5 через именованные каналы без применения DLL" - страница 4

 
Renat:
При передаче строк сначала идут 4 байта ее размера.

Исправил функцию приема данных с указанием явного размера буфера.

Понял причину не работы обратной передачи - не указывал длину передаваемых данных.

Огромное спасибо. Все заработало.

Пайпы - это сила. Респект автору статьи. 

 
Renat:
Сделали в прошлом билде MetaTrader 4.
  Я извиняюсь, думал что то пропустил. Посмотрел на анонс 445  - там действительно о пайпах есть. Вопрос в том что в справке об этом ни слова. Будут ли обновления хелпа по этому поводу, и когда ? может пока в форуме опишете.
 

Пайпы в четверке работают аналогично пятерке, тоже через файловые операции.

Статью для МТ4 выпустим. 

 
Renat:

Пайпы в четверке работают аналогично пятерке, тоже через файловые операции.

Статью для МТ4 выпустим. 

здравствуйте, можно ли какой-нибудь простой пример для MT4? на статью и не расчитываю конечно

конкретно интересует, как в терминале считать с моей самописной программы три параметра в советник

 
Renat:
Сделали в прошлом билде MetaTrader 4.

Вроде бы, на МТ5 все прекрасно работает.

Единственный момент:

  • хорошо бы сделать, чтобы при попытке чтения из канала методами ReadString и остальными сначала проверялась целостность pipe-канала.

Иначе висим в методе WaitForRead до бесконечности, хотя серверная сторона давно закрылась. Это все проверялось под Win7-64.

Добавил в метод WaitForRead выход по тайм-ауту и еще некоторые ухищрения на серверной стороне - получилась рабочая система с автоматическими реконнектами на обеих сторонах канала,

но как-то это "костыльно" все.

 
Dima_S:

Вроде бы, на МТ5 все прекрасно работает.

Единственный момент:

  • хорошо бы сделать, чтобы при попытке чтения из канала методами ReadString и остальными сначала проверялась целостность pipe-канала.

Иначе висим в методе WaitForRead до бесконечности, хотя серверная сторона давно закрылась. Это все проверялось под Win7-64.

Добавил в метод WaitForRead выход по тайм-ауту и еще некоторые ухищрения на серверной стороне - получилась рабочая система с автоматическими реконнектами на обеих сторонах канала,

но как-то это "костыльно" все.

С нашей стороны это была демонстрация возможности.

Выложите свой вариант класса, пожалуйста. Штатный класс допилим.

 
Собственно, добавил только метод WaitForRead с проверкой на ошибки и выходом по тайм-ауту ( время ожидания - в условных единицах - число примерно 20мсек интервалов ):
bool
CFilePipe::WaitForRead( const ulong size, const int _time_out )
{
  int  count = 0;

  while( count < _time_out && m_handle != INVALID_HANDLE && !IsStopped( ))
  {
    if( FileSize( m_handle ) >= size )
    {
     return( true );
    }
    else if( GetLastError( ) != 0 )
    {
      return( false );
    }
    Sleep( 1 );
    count++;
  }

  return( false );
}


Сама клиентская часть примерно так выглядит:

while( !IsStopped( ))
{
//  Пытаемся подключиться к серверному PIPE:
  Print( "Try to connect" );
  if( pipe_Ptr.Open( ch_name, FILE_READ | FILE_WRITE | FILE_ANSI ) != INVALID_HANDLE )
  {
    if( IsStopped( ))
    {
      pipe_Ptr.Close( );
      return;
    }
    Print( "Pipe " + ch_name + " opened" );

//  Цикл приема данных:
    while( !IsStopped( ))
    {
//  Проверяем целостность соединения:
      if( !pipe_Ptr.WriteString( "@" ))
      {
        Print( "Disconnected: ", GetLastError( ));
        pipe_Ptr.Close( );
        break;
      }

//  Получаем данные:
      if( pipe_Ptr.WaitForRead( sizeof( int ), 100 ))
      {
        if( !pipe_Ptr.ReadString( str ))
        {
          Print( "Reading string failed: ", GetLastError( ));
          pipe_Ptr.Close( );
          break;
        }
        Print( "Server: ", str, " received" );
      }
    }
  }
  Sleep( 1000 );
}

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

Тайм-аут помогает, но ИМХО не во всех возможных ситуациях. Было бы хорошо в методе FileSize проверять все эти ошибки.

 

Странно...

Картинки что ли из буфера не проходят в комменты и точно если по alt+PrntScr и в редактор вставить то картинка вставляется а сообщение в ветку не попадает.

Ладно проблема в том что тестовый пример из статьи не проходит

Но в терминале скрипт ничего в лог не пишет пока я его не удалю с чарта

а после вижу в журнале

2013.03.26 15:33:11     PipeClient (EURUSD,M5)  Client: sending welcome message failed
2013.03.26 15:33:11     PipeClient (EURUSD,M5)  Client: pipe opened

Win7x64 билд 787 от 21 марта 2013 года

 

Только что проверил, все работает. 


В MQ5 надо только заменить строку

uint items=ExtPipe.ReadDoubleArray(buffer);

на 

uint items=ExtPipe.ReadArray(buffer);
 
Renat:

Только что проверил, все работает. 


В MQ5 надо только заменить строку

У меня нет ..

строку заменил иначе не компилировалась

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