Dlatego że przy załadowaniu tej .dll na jednym wykresie nie ma problemu .
Jeśli jednak będziesz ją chciał wykorzystać na kilku wykresach to ten kod jest zbyt prymitywny.
Dll jest ładowany jednokrotnie bez względu na ilość EA załadowanych na wykresy ,ale każdy wykres tworzy oddzielny dla siebie wątek i dane globalne traktuje jako swoje własne w tym przypadku będzie to np. wskaźnik do bufora który jest modyfikowany (pamięć z nim związana).Kolejne wątki ("wykresy") z EA będą więc wzajemnie nadpisywać sobie dane globalne.
Najłatwiej umieścić zmienne w sekcji TLS biblioteki , czyli oznaczyć je jako lokalne dla wątku lub tak napisać bibliotekę żeby nie doszło do nadpisywania pamięci .
http://pl.wikipedia.org/wiki/Pami%C4%99 ... w%C4%85tku
Mi proste opcje kompilatora nie działają dobrze i tak skompilowana dll nie działa,ma prawo.Osobiście używam innego rozwiązania związanego z klasami C++ ,więc nie chce mi sie wnikać co jest skopane .
Można TLS za pomocą APIWin zakodzić ,ale to jest temat dla masochistów.
A właściwie to pewnie chodzi o XP:
Na systemach Windows starszych niż Vista oraz Server 2008 __declspec(thread) działa w bibliotekach DLL tylko gdy są one powiązane statycznie z plikiem wykonywalnym i nie zadziała z bibliotekami ładowanymi przez LoadLibrary() (może wystąpić błąd ochrony lub uszkodzenia danych).
Są również dodatkowe zasady: "Zasady i ograniczenia TLS" (j. ang) w MSDN.
-- Dodano: pt 31-05-2013, 5:04 --
W ten sam sposób można wymieniać dane innego typu np. podzielić bufor na dane dla string i tablicy double.
W załaczniku .dll - modyfikacja funkcji Init + funkcje dla tablicy double :
Kod: Zaznacz cały
#include <windows.h>
//---------------------------------------------------------------------------
extern "C"
{
bool __declspec(dllexport) __stdcall Init(LPCSTR name,int len_str,int len_dbl);
void __declspec(dllexport) __stdcall Deinit(void);
bool __declspec(dllexport) __stdcall WriteStrBuff(const char* s);
LPCSTR __declspec(dllexport) __stdcall ReadStrBuff(void);
bool __declspec(dllexport) __stdcall WriteDblBuff(double d[],int len);
bool __declspec(dllexport) __stdcall ReadDblBuff(double*d,int len);
}
//--------------------------------------------------------------------------
PBYTE pBuff = 0 ;
HANDLE hFileMapp = 0;
int SizeBuff ;
int OffsetDbl ;
const char* ret0 ="" ;
//--------------------------------------------------------------------------
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
//----------------------------------------------------------------------------
HANDLE QCreateFileMapping(LPCSTR name)
{
HANDLE h ;
h = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,
0,SizeBuff,name);
return h ;
}
//---------------------------------------------------------------------------
PBYTE QMapViewOfFile(HANDLE hFileMapping)
{
return (PBYTE)MapViewOfFile(hFileMapping,FILE_MAP_READ|FILE_MAP_WRITE,
0,0,0);
}
//----------------------------------------------------------------------------
void __stdcall Deinit(void)
{
if(pBuff)
{
UnmapViewOfFile(pBuff);
pBuff = NULL ;
}
if(hFileMapp)
{
CloseHandle(hFileMapp);
hFileMapp = NULL;
}
}
//---------------------------------------------------------------------------
bool __stdcall Init(LPCSTR name,int len_str,int len_dbl)
{
SizeBuff = len_str+ (len_dbl*sizeof(double));
OffsetDbl = len_str ;
hFileMapp = QCreateFileMapping(name);
if(NULL!=hFileMapp)
{
pBuff = QMapViewOfFile(hFileMapp);
if(pBuff!=NULL)
{
memset(pBuff,0,SizeBuff);
return true ;
}
return false ;
}
return false ;
}
//---------------------------------------------------------------------------
bool __stdcall WriteStrBuff(const char* s)
{
if(pBuff!=NULL)
{
lstrcpy(pBuff,s);
return true;
}
return false;
}
//---------------------------------------------------------------------------
LPCSTR __stdcall ReadStrBuff(void)
{
if(pBuff!=NULL)
{
if(pBuff[0]!= 0)
{
return pBuff ;
}
}
return ret0 ;
}
//---------------------------------------------------------------------------
bool __stdcall WriteDblBuff(double d[],int len)
{
if(pBuff!=NULL)
{
memcpy((pBuff+OffsetDbl),d,len*sizeof(double));
return true;
}
return false;
}
//---------------------------------------------------------------------------
bool __stdcall ReadDblBuff(double*d,int len)
{
if(pBuff!=NULL)
{
memcpy(d,(pBuff+OffsetDbl),len*sizeof(double));
return true;
}
return false;
}
//---------------------------------------------------------------------------
EA Pisze :
Kod: Zaznacz cały
#import "filemapp.dll"
bool Init(string,int len_str,int len_dbl);
void Deinit();
bool WriteStrBuff(string);
string ReadStrBuff();
bool WriteDblBuff(double d[],int len);
bool ReadDblBuff(double d[],int len);
#import
#define LEN_STR 512
#define LEN_DBL 1024
double Dbl_Buff[LEN_DBL];
//+------------------------------------------------------------------+
int init()
{
//----
bool ret = Init("filemem",LEN_STR,LEN_DBL);
if(false == ret)
{
MessageBox("Error Init()");
}
//----
return(0);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int deinit()
{
//----
Deinit();
//----
return(0);
}
//+------------------------------------------------------------------+
int counter = 0 ;
//+------------------------------------------------------------------+
int start()
{
//----
Dbl_Buff[0] = Close[0] ; // pierwsza pozycja w tablicy
Dbl_Buff[LEN_DBL-1] = MathAbs((Close[0]-Open[0])/Point) ; // ostatnia pozycja w tablicy
counter++ ;
WriteStrBuff("Ala ma kota ->"+counter);
//zapis tablicy
WriteDblBuff(Dbl_Buff,LEN_DBL);
//----
return(0);
}
EA Czyta :
Kod: Zaznacz cały
#import "filemapp.dll"
bool Init(string,int len_str,int len_dbl);
void Deinit();
bool WriteStrBuff(string);
string ReadStrBuff();
bool WriteDblBuff(double d[],int len);
bool ReadDblBuff(double d[],int len);
#import
#define LEN_STR 512
#define LEN_DBL 1024
double Dbl_Buff[LEN_DBL];
//+------------------------------------------------------------------+
int init()
{
//----
bool ret = Init("filemem",LEN_STR,LEN_DBL);
if(false == ret)
{
MessageBox("Error Init()");
}
//----
return(0);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int deinit()
{
//----
Deinit();
//----
return(0);
}
//+------------------------------------------------------------------+
string read ;
//+------------------------------------------------------------------+
int start()
{
//----
read = ReadStrBuff();
ReadDblBuff(Dbl_Buff,LEN_DBL);
read = read +" Close Candle[0] = " + DoubleToStr(Dbl_Buff[0],Digits)+ " Size Candle = " +
DoubleToStr(Dbl_Buff[LEN_DBL-1],0);
Comment(read);
//----
return(0);
}
RATUNKU !!!!!!
-- Dodano: pt 31-05-2013, 5:06 --
NIe mogę edytować postu ,zle wstawiłem znaczniki .
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Nie spiesz się , zawsze zdążysz stracić .