Farklı terminallerde çalışan iki Uzman Danışman arasında veri alışverişi - sayfa 4

 

Kayıt defterine eziyet etmeye bir alternatif olarak - basit bir dosya değişimi. (Dosya sisteminin NTFS olduğunu varsayıyorum)

Her bir kursta \experts\files içinde 2 adet c:\mt1, c:\mt2 terminali vardır

değişim klasörleri oluştur c:\mt1\experts\files\ exchange c:\mt2\experts\files\ exchange

Vista MKLINK'te Windows Server 2003 Kaynak Seti Araçlarından (win 2000,2003,xp için) linkd komutuyla bir bağlantı oluşturun

linkd.exe c:\ mt1 \experts\files\ exchange c:\ mt2 \experts\files\ exchange

artık terminaller için ortak bir dizindir. (herhangi bir dosyayı c:\ mt1 \experts\files\ exchange'e kopyalayın ve c:\ mt2 \experts\files\ exchange dizinine göz atın )

aynısı Far - Alt F6 ile yapılabilir.

 
JavaDev >> :

Kayıt defterine eziyet etmeye bir alternatif olarak - basit bir dosya değişimi. (Dosya sisteminin NTFS olduğunu varsayıyorum)

Her bir kursta \experts\files içinde 2 adet c:\mt1, c:\mt2 terminali vardır

değişim klasörleri oluştur c:\mt1\experts\files\ exchange c:\mt2\experts\files\ exchange

Vista MKLINK'te Windows Server 2003 Kaynak Seti Araçlarından (win 2000,2003,xp için) linkd komutuyla bir bağlantı oluşturun

linkd.exe c:\ mt1 \experts\files\ exchange c:\ mt2 \experts\files\ exchange

artık terminaller için ortak bir dizindir. (herhangi bir dosyayı c:\ mt1 \experts\files\ exchange'e kopyalayın ve c:\ mt2 \experts\files\ exchange dizinine göz atın )

aynısı Far - Alt F6 ile yapılabilir.

Yine de, dosyalar aracılığıyla iletişim doğru araç değildir. Kasıtlı değildi.

Dosyalar, bilgilerin uzun süreli depolanması için tasarlanmıştır. Neden bir diskle uğraşıyorsunuz? İletişim için RAM var.

 
Andres >> :

Bundan sonra ortaya çıkıyor:

2009.05.19 01:22:16 2008.12.31 01:49 geçici EURUSD,M1: ####
2009.05.19 01:22:16 2008.12.31 01:49 temp EURUSD,M1: RegCreateKeyExA(): Var olmayan bir bölüm oluşturuldu.
2009.05.19 01:22:16 sıcaklık test için başladı

Yani, arama sırasında herhangi bir hata oluşmamasına rağmen arabelleğin içeriği değişmez. Ve kayıt defteri tam olarak "Test" dizesini içeriyor

Forum gönderilerinden bunun, dizelerin MQL ortamından DLL işlevlerine olağandışı geçişinden kaynaklandığını anladım. MQL ortamında, geliştiriciler kendi yöneticilerini (dize havuzu) kullanarak dizeler üzerinde çalışırlar ve görünüşe göre bu sınırda yanlış arabellek dolduruluyor ve bu nedenle API işlevi tarafından döndürülen sonucu göremiyoruz. Ancak, tam maksimum uzunlukta başlatılan dizeleri kullanırsanız, bildiğim kadarıyla sorun olmaz. Bu yüzden 255 karakterden oluşan bir "#" satırı var. Çizgiyi gözle görünür kılmak için "#" sembolü seçildi. Çağrıdan önce arabelleğin nasıl doldurulduğu önemli olmadığından, bunun Win API'sinin kendisiyle ilgisi yoktur. Bu, daha önce bahsettiğim hattın uzunluğundaki sınırlamadır. 255 karakterden büyük dizeleri SetStringValue() öğesine iletebilirsiniz, ancak bunları okuyamazsınız.

Tabii ki, kısıtlama olmadığında iyidir, ancak çok fazla rahatsızlık görmüyorum. Soru ortaya çıkıyor: neden belirli bir boyutta bir dize okumanız gerekiyor? Bu bir sınırlamaysa, kayıt defterine yazıldığında kaynak dizeyi 255 + "artık" parametre uzunluğunda N parametresine bölen bir işlev yazılarak da atlanabilir. Ve okurken - geri toplar. Başka yolu yok gibi. Zor bulursan, benimle iletişime geç - yapacağım. Sadece herkesin ihtiyaçları farklıdır, her şeyi öngöremezsiniz, sadece bu benim için yeterli ve birileri global değişkenleri ve hatta birkaç düzeyde kullanıyor.

Anlamıyorum ... 255 karakter sınırı nerede? MQL4'te böyle bir kısıtlama olmadığını kesin olarak biliyorum.

Kod örneği, sorunun özüne dair ince bir ipucuydu :-))

 
Zhunko >> :

Yine de, dosyalar aracılığıyla iletişim doğru araç değildir. Kasıtlı değildi.

Dosyalar, bilgilerin uzun süreli depolanması için tasarlanmıştır. Neden bir diskle uğraşıyorsunuz? İletişim için RAM var.

Kısmen katılıyorum.

RAM aracılığıyla mümkün - ama zor (hepsi aynı, forum% 100 sistem programcısı değil ve% 50 bile değil).

Ve biraz daha geniş bakarsanız - unix'te - tüm dosyalar, RAM ve diskler ve işlemler var.

Ben sadece birçok yoldan birini önerdim.

 
Zhunko >> :

Anlamıyorum... 255 karakter sınırı nerede? MQL4'te böyle bir kısıtlama olmadığını kesin olarak biliyorum.

Kod örneği, sorunun özüne dair ince bir ipucuydu :-))

Programın yürütülmesi sırasında bir dizgeyi artırdığınızda, herhangi bir kısıtlama yoktur, ancak daha sonra artık bir dizge sabiti olmadığı ortaya çıkar. Ve buradaki dize sabitlerinin uzunluğu hakkında, belgeler açıkça şunları söylüyor:

Dize sabitinin uzunluğu 0 ila 255 karakter arasındadır. Bir dize sabitinin uzunluğu maksimum uzunluğu aşarsa, sağdaki fazladan karakterler atılır ve derleyici ilgili bir uyarı verir.

 
Andres >> :

Programın yürütülmesi sırasında bir dizgeyi artırdığınızda, herhangi bir kısıtlama yoktur, ancak daha sonra artık bir dizge sabiti olmadığı ortaya çıkar. Ve buradaki dize sabitlerinin uzunluğu hakkında, belgeler açıkça şunları söylüyor:

Bizim durumumuzda, sabit olup olmaması önemli değildir.

Bir değişken aracılığıyla daha fazlasının mümkün olduğu anlamına mı geliyor?

 
Zhunko >> :

Bizim durumumuzda, sabit olup olmaması önemli değildir.

Bir değişken aracılığıyla daha fazlasının mümkün olduğu anlamına mı geliyor?

Neden önemli değil? Önemli olan nokta budur (!), çünkü sabit bir dize biçiminde bir arabellekle, API çağrısı beklendiği gibi çalışır ve "dinamik olarak" oluşturulmuş bir dizenin arabelleğiyle, API çağrısı hatasız çalışır, ancak, daha önce açıklanan nedenlerle, bu dizede kayıt defterinden veri gözlemlemiyoruz.


Andres yazdı >>
Programın yürütülmesi sırasında bir dizgeyi artırdığınızda, herhangi bir kısıtlama yoktur, ancak daha sonra artık bir dizge sabiti olmadığı ortaya çıkar. Ve buradaki dize sabitlerinin uzunluğu hakkında, belgeler açıkça şunları söylüyor:

Burada kütüphane limitinden değil, string uzunluk limitinden bahsediyordum.

Bir dize sabiti kullanarak ve dinamik olarak artan bir dize kullanarak kayıt defterinden verileri kendiniz almaya çalışın; farkı göreceksiniz. İlk durumda, veriler ikinci olarak gelir - hayır.

 
Andres >> :

Burada kütüphane limitinden değil, string uzunluk limitinden bahsediyordum.

Bir dize sabiti kullanarak ve dinamik olarak artan bir dize kullanarak kayıt defterinden verileri kendiniz almaya çalışın; farkı göreceksiniz. İlk durumda, veriler ikinci olarak gelir - hayır.

Harika! ... Belleğin işlevin hangi yerine tahsis edildiği önemli mi?

 

IMHO, programlar arasında veri paylaşmanın en iyi yolu sanal dosyalardır:

 // Открываем объект-отображение FILE_MAP_READ

hMMF = OpenFileMapping ( FILE_MAP_WRITE , FALSE , lpFileShareName ) ;

// Если открыть не удалось, выводим код ошибки

if ( hMMF = = NULL ) {

MessageBox ( NULL , "OpenFileMapping: Error" , "RealTimeData" , MB_OK ) ;

return 0 ;

}

// Выполняем отображение файла на память FILE_MAP_READ 

// В переменную lpMMF будет записан указатель на отображаемую область памяти

lpMMF = MapViewOfFile ( hMMF , FILE_MAP_WRITE , 0 , 0 , sizeof ( NSDTfeedTick ) ) ;

// Если выполнить отображение не удалось, выводим код ошибки

if ( lpMMF = = 0 ) {

MessageBox ( NULL , "MapViewOfFile: Error" , "RealTimeData" , MB_OK ) ;

return 0 ;

}

//---

vb.....

Her şey güvenilir ve hatasız çalışıyor .... Elektronik tarafından kontrol edildi :)

 
klot >> :

IMHO, programlar arasında veri paylaşmanın en iyi yolu sanal dosyalardır:

vb.....

Her şey güvenilir ve hatasız çalışıyor .... Elektronik tarafından kontrol edildi :)

Oldukça doğru. FileMapping, en kolay olmasa da harika bir araçtır. Ayrıca boruları veya posta yuvalarını da deneyebilirsiniz.