İyi günler
C++ Builder projesinden bağlanamıyorum.
İşte kod
void __fastcall TForm1::FormActivate(TObject *Sender) { AnsiString path_MemMap32=ExtractFileDir(ParamStr(0)) + "\\dll\\MemMap32.dll"; AnsiString path_file="Local\\Monitor_USDCHF"; wchar_t * UnicodeString = new wchar_t[path_file.WideCharBufSize()]; path_file.WideChar(UnicodeString,path_file.WideCharBufSize()); delete [] UnicodeString; int (__stdcall *MemOpen) (char * path,int size,int mode,int &err); void (__stdcall *MemClose)(int hmem); int (__stdcall *MemRead)(int hmem, int v[], int pos, int sz, int &err); HINSTANCE hDLL= LoadLibrary(path_MemMap32.c_str()); if(!hDLL) {StatusBar1->SimpleText="I can't load dll";} else {StatusBar1->SimpleText="path_MemMap32.dll load";} MemOpen= (int(__stdcall *)(char * path,int size,int mode,int &err)) GetProcAddress(hDLL,"MemOpen"); MemClose=(void(__stdcall*)(int hmem)) GetProcAddress(hDLL,"MemClose"); MemRead= (int(__stdcall *)(int hmem, int v[], int pos, int sz, int &err)) GetProcAddress(hDLL,"MemRead"); hmem=MemOpen(path_file.c_str(),-1,0,err); StatusBar1->SimpleText=err; }
Durum çubuğu 2 diyor, yani dosya bulunamadı, dosyanın yolunu göndermek için hem ansi hem de unicode'da denedim
MT5 dosyasında Uzman Danışman bir dosya oluşturdu ve içindeki teklifleri güncelledi.
Eğer C++'ınız varsa, neden bir DLL kullanmaya karar verdiniz?
Kaynak kodu orada tamamen mevcuttur.
Eğer C++'ınız varsa, neden bir DLL kullanmaya karar verdiniz?
Kaynak kodu orada tamamen mevcut.
Hazır bir DLL kullanmak istedim.
Böylece MT4-5 ile sorun yaşamayacaktım.
... DLL'in kaynak kodunu görmeye çalışacağım
Hazır dll kullanmak istedim.
böylece MT4-5'te tartışmayla ilgili herhangi bir sorun olmayacaktı.
... Dll'in kaynak kodunu görmeye çalışacağım.
Windows'unuz nedir?
win7x64
Builder'da yazamam.
ve böyle yazamam.
#include <vcl.h> #include <stdafx.h> #include "BuySell.h"Anladım.
[C++ Fatal Error] afxv_w32.h(14): F1003 Error directive: WINDOWS.H already included. MFC apps must not #include <windows.h>
Önce bağlanmayı denedim
afxv_w32.h
yardım etmedi
Önce afxwin.h dosyasını takmayı denedim - bu da işe yaramadı.
Önce afxwin.h dosyasını takmayı denedim - bu da işe yaramadı.
başka bir seçenek olarak bağlı afx.h'yi arayın.
Evet, bu yüzden hata olmadan daha fazla deneyeceğim. Teşekkür ederim.
...
Anladım. Her şey çalışıyor.
Ama CloseHandle nedense kapanmıyor.
Exe'de bir sunucum var (güncellemeler oluşturuyor ve kapanması gerekiyor) ve terminalde bir alıcı var, bu yüzden sunucuda CloseHandle'dan sonra bellekte başarısız nesneyi görüyor.
Echo'da bir sunucum (onu günceller ve kapatır) ve terminalde bir alıcım var, bu nedenle sunucuda CloseHandle'dan sonra bellekte başarısız nesneyi görüyor.
ve kol kapatıldığında belleğin tamamen temizlenmesini mi bekliyorsunuz?
İyi günler
Lütfen bana düşünce gelişiminin yönünü söyleyin.
Bir bilgisayar (sunucu) içindeki sinyalleri birçok terminale dağıtmak için bir görev var, 1-3 ms'den fazla kritik gecikmeler.
Bir istemci-sunucu paketinde uygulanan 1-2 hesap kabul edilebilir çalışır ve terminali asmamak için bir döngüde Sleep(1) kullanarak bellekten okuma yapılır - bellek gerekli değeri alırsa, o zaman bazı eylemler gerçekleştirir. Ancak terminaller 5 terminal bile olsa, burada 1 ms artık onsuz yapamaz, aksi takdirde işlemci üzerindeki soğutucu ulumaya başlar ...
Haberleri uzun zamandır takip etmedim, belki mt5'te OnTrade'e benzer özel olaylar vardır, böylece bellek modifikasyonuna bağlanabilirler.
Gecikme olmadan okumayı denedim 100 000 döngü (her biri 8 bayt) 670 ms'de geçiyor.
... belki de verileri 4 bayta düşürmeliyim.
... muhtemelen dll'inizi içinde döngü oluşturacak şekilde yeniden oluşturmak için başka bir seçenek daha vardır - gerekli değerleri kabul etmeyene kadar veri döndürmemek. ancak MT5'in harici bir işlevden dönüş için bu kadar uzun süre beklemeye nasıl tepki vereceği başka bir sorudur.
Bir bilgisayar (sunucu) içindeki sinyalleri birçok terminale dağıtmak için bir görev vardır, 1-3 ms'den fazla gecikmeler kritiktir.
İstemci-sunucu paketinde uygulandığında, 1-2 hesap kabul edilebilir şekilde çalışır ve terminali asmamak için bir döngüde Sleep(1) kullanılarak bellekten okuma yapılır - bellek gerekli değeri alırsa bazı eylemler gerçekleştiririz. Ama terminaller 5 terminal bile olsa, burada 1 ms yapılamaz, aksi takdirde işlemci üzerindeki soğutucu ulumaya başlar ...
Haberleri uzun zamandır takip etmiyorum, belki mt5'te OnTrade'e benzer kullanıcı olayları vardır, böylece bellek modifikasyonuna bağlanabilirler.
Sizin durumunuzda, yalnızca sunucunun belleği değiştirme hakkı vardır. İstemciler bunu okur.
- Pipe yönüne bakın. orada veri varış "olayları" kendini açıklayıcı olarak gerçekleştirilir - veri varsa alırız, yoksa bekleriz.
Evet, sunucunun MSDN'den yazılması veya kopyalanması gerekecektir, ancak hazır istemciler doğrudan MQL5'te kullanılabilir.
Ne yazık ki, burada da yoklamanın periyodikliği ile başa çıkmanın bir yolu yoktur. Bu kadar çok sayıda Uzman Danışman'da Sleep(1), bellekle çalışırken bile gürültü yapmamalıdır. İşlevlerin zamanlamasını kontrol etmeniz gerekir, belki bir yerlerde fazladan geçişler ve yükler vardır.
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Tekliflerin izlenmesi (haritalama için örnek):
Dosya Eşleme işlevleriyle çalışmak için DLL kullanımına bir örnek. Bu örnekte, başlatılan Uzman Danışman bellekte sanal bir dosya oluşturur ve içindeki sembol fiyat teklifini güncellemeye başlar. Diğer terminallerde EA'lar başlatıldığında, bu EA'lar oluşturulan dosyayı açar ve benzer şekilde içindeki fiyat tekliflerini güncellemeye başlar. Böylece, Uzman Danışmanlar fiyat tekliflerini tek bir ortak dosya üzerinden değiştirirler.
Author: ---