"DLL'leri Kullanmadan Adlandırılmış Kanalları Kullanarak MetaTrader 5 ile İletişim Kurma" makalesi için tartışma - sayfa 4

 
Renat:
Dizeleri iletirken, boyutunun 4 baytı önce gider.

Açık tampon boyutunu belirterek veri alma işlevi düzeltildi.

Ters aktarımın neden çalışmadığını anladım - aktarılan verinin uzunluğunu belirtmedim.

Çok teşekkür ederim. Her şey çalıştı.

Borular güçlüdür. Makalenin yazarına saygılar.

 
Renat:
MetaTrader 4'ün son sürümünde yapıldı.
Özür dilerim, bir şeyi kaçırdığımı düşündüm. Duyuru 445'e baktım - gerçekten de orada pipler hakkında var. Soru şu ki, yardımda bununla ilgili bir kelime yok. Bu konuda herhangi bir güncelleme olacak mı ve ne zaman? Belki bunu forumda açıklayabilirsiniz.
 

4'teki borular, dosya işlemleri yoluyla da 5'e benzer şekilde çalışır.

MT4 için bir makale yayınlayacağız.

 
Renat:

4'teki borular, dosya işlemleri yoluyla da 5'e benzer şekilde çalışır.

MT4 için bir makale yayınlayacağız.

merhaba, MT4 için basit bir örnek alabilir miyim? Elbette bir makaleye güvenmiyorum.

Özellikle kendi yazdığım programdan üç parametreyi terminaldeki bir Uzman Danışmana nasıl okuyacağımla ilgileniyorum.

 
Renat:
MetaTrader 4'ün son yapısında yapıldı.

MT5'te her şey iyi çalışıyor gibi görünüyor.

Tek nokta:

  • ReadString ve diğer yöntemleri kullanarak kanaldan okumaya çalışırken, önce boru kanalının bütünlüğünün kontrol edilmesini sağlamak iyi olurdu.

Aksi takdirde, sunucu tarafı uzun süredir kapalı olmasına rağmen, WaitForRead yönteminde süresiz olarak asılı kalıyoruz. Tüm bunlar Win7-64 altında kontrol edildi.

Sunucu tarafındaki WaitForRead metoduna zaman aşımı ve diğer bazı hileler ekledim ve kanalın her iki tarafında otomatik yeniden bağlanma ile çalışan bir sistem elde ettim,

ama hepsi biraz "koltuk değneği" gibi.

 
Dima_S:

MT5'te her şey iyi çalışıyor gibi görünüyor.

Tek nokta:

  • ReadString ve diğer yöntemleri kullanarak kanaldan okumaya çalışırken, önce boru kanalının bütünlüğünün kontrol edilmesini sağlamak iyi olurdu.

Aksi takdirde, sunucu tarafı uzun süredir kapalı olmasına rağmen, WaitForRead yönteminde süresiz olarak asılı kalıyoruz. Tüm bunlar Win7-64 altında kontrol edildi.

Sunucu tarafındaki WaitForRead metoduna zaman aşımı ve diğer bazı hileler ekledim ve kanalın her iki tarafında otomatik yeniden bağlanma ile çalışan bir sistem elde ettim,

ama hepsi biraz "koltuk değneği" gibi.

Bizim açımızdan bu bir olasılık göstergesiydi.

Lütfen sınıfın kendi varyantını gönderin. Standart sınıfı son haline getireceğiz.

 
Aslında, sadece WaitForRead metodunu hata kontrolü ile ekledim ve zaman aşımı ile çıktım (bekleme süresi - geleneksel birimlerde - yaklaşık 20msn aralıkların sayısı):
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 );
}


İstemci kısmının kendisi kabaca bu şekilde görünüyor:

while( !IsStopped( ))
{
// Sunucuya bağlanmaya çalışılıyor 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" );

// Veri alım döngüsü:
    while( !IsStopped( ))
    {
// Bağlantının bütünlüğünü kontrol edin:
      if( !pipe_Ptr.WriteString( "@" ))
      {
        Print( "Disconnected: ", GetLastError( ));
        pipe_Ptr.Close( );
        break;
      }

// Veri alınıyor:
      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 );
}

Mesele şu ki, verilerin gelmesini beklerken kullanılan FileSize yöntemi bir bağlantı ihlali tespit etmiyor (görünüşe göre kontrol etmiyor).

Zaman aşımı yardımcı olur, ancak IMHO olası tüm durumlarda değil. FileSize metodunda tüm bu hataları kontrol etmek iyi olurdu.

 

Garip...

Ara bellekteki resimler yorumlara girmiyor ve tam olarak alt+PrntScr kullanıp editöre yapıştırırsanız, resim ekleniyor ancak mesaj dala girmiyor.

Tamam, sorun şu ki makaledeki test örneği geçmiyor

Ancak terminalde, ben onu grafikten silene kadar komut dosyası hiçbir şey kaydetmiyor.

ve sonra günlükte görüyorum

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

21 Mart 2013 tarihli Win7x64 yapı 787

 

Az önce kontrol ettim, her şey çalışıyor.


MQ5'te yalnızca şu satırı değiştirmeniz gerekir

uint items=ExtPipe.ReadDoubleArray(buffer);

на 

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

Az önce kontrol ettim, her şey çalışıyor.


MQ5'te yalnızca şu satırı değiştirmeniz gerekir

Bende yok ...

Satırı değiştirdim yoksa derlenmeyecekti.