Memory Mapped Files, Internal Error 200702251 ???

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Mathias
Beiträge: 6938
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Memory Mapped Files, Internal Error 200702251 ???

Beitrag von Mathias »

Wo ist der Vorteil, ist es nicht schneller in der Verarbeitung nur mit Pointern zu arbeiten?
Mit Pointer schleichen sich gerne Fehle in den Code ein.

Der Vorteil der dynamischen Array, du kannst zu Laufzeit die Länge der Array bestimmen. Sie kann auch zu Laufzeit vergrössert und verkleinert werden, man muss nur SetLength(meineArray) aufrufen. Um die Speicherverwaltung muss du dich nicht kümmern, dies geht automatisch.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

Re: Memory Mapped Files, Internal Error 200702251 ???

Beitrag von laz847 »

Naja das kuriose in diesem Fall ist das ich über das Input Array nur bedingt Kontrolle habe, wenn ich das orginale aus dem MT4 verwende, was am sinnvollsten ist weil da auch Routinen existieren um es zu befüllen. Dieses dynamische Array kommt kommt mit völlig falschen Count in der dll an, da muss man sich extra per Parameter die wirkliche Länge mitgeben. Es ist grösser als es eigentlich befüllt wurde.

Habe in der dll das Array jetzt auf [] also dynamisch, hab auch die Umschreibungen raus und schreibe das ankommende Array jetzt direkt in den MMF, bisher scheints zu gehen :D . Muss mich mal schlau machen was passiert mit unbenutzten MMF Files? Evtl. weisst Du das ja?

Weiß ich jetzt auch, wenn ich einmal

aaaaa

schreibe und danach b steht

baaaa drin.

Die alten Daten bleiben also bestehen ;), gibts da evtl. nen Befehl das Teil zu Clearen ;) ??? Ich suche schon im Netz aber da scheint wieder der Haken der Geschichte zu sein, sieht so aus als wenn man vorm Beschreiben einmal leer drüber schreiben muss :roll:

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Memory Mapped Files, Internal Error 200702251 ???

Beitrag von theo »

@laz847: Ich bin dann mal weg. Das ist mir alles zu sehr durcheinander.
Ich werde das Gefühl nicht los, dass die Aufgabe, die du dir vorgenommen hast für deinen Kenntnisstand zu hoch ist.
Da du auch nicht den Weg gehen willst, den man dir vorschlägt, sondern bei jedem auftretenden und möglicherweise banalen Fehler lieber eine Komplikationsstufe höher gehst (Memoy Mapped Files etc.), bin ich mit meinem Latein am Ende.

Viel Glück Dir!

laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

Re: Memory Mapped Files, Internal Error 200702251 ???

Beitrag von laz847 »

"Ich werde das Gefühl nicht los, dass die Aufgabe, die du dir vorgenommen hast für deinen Kenntnisstand zu hoch ist."

Da hast Du Recht ich bewege mich auf Neuland aber das heißt ja nicht, dass man es nicht hinbekommt. Ich lerne jede Sekunde und lese an einem Tag mehr als manche in einem Monat :shock:.

Keine Sorge das ist so meine Art, learning by doing. Ich setz mich solange davor bis ich es verstanden habe. Aber ich verstehe das Dir das zu crazy war, es hat einfach auch gedauert bis ich wusste was ich wie haben will und umsetze, zumal das Gegenstück in MQL4 kompatibel sein muss. War meine Schuld! Die Kommunikation kann gern über TCP egal ob LNet oder Synapse gehen, aber NICHT der Datentransfer. Damit würde ich nur den Kanal blockieren den ich wieder für andere Dinge brauche.

Zu guter Letzt habe ich nun beschlossen auch TCP rauszuwerfen und noch die DLL :D!!!! Ich habe (was ich vorher nicht geschafft hatte) endlich MMF auf dem Metatrader direkt zum Laufen bekommen. Damit können sämtliche Umwege, und der riesen Mehraufwand nun entfallen.

Im MT4 geht MMF super auch wenn ich es von 2 unterschiedlichen Instanzen aus mache, nur finde ich in Lazarus noch kein Handle auf die Map. Kann das evtl. mit dem Namen zu tun haben?

Code: Alles auswählen

hMapFile:=OpenFileMapping(FILE_MAP_READ,False,PChar('PriceMap1000'));
 
Bleibt 0 auch wenn ich die Map von nem Mql4 Clienten aus lesen kann? Der MT4 verwendet Unicode kann es sein das der die Map anders anlegt?
 
MQL4
hMapFile = CreateFileMappingA(INVALID_HANDLE_VALUE,0,PAGE_READWRITE,0,BUF_SIZE,"PriceMap1000");
 
Global hab ich probiert "Global\\PriceMap1000" geht auch nicht, hab auch die msdn gefunden :oops:

Vielleicht hast Du ja nochmal Erbarmen, ich weiß jetzt was ich will und wie ich es will, die MMF reichen für alles was ich damit umsetzen muss und es ist schnell genug, keine DLL kein TCP mehr, versprochen :oops:

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Memory Mapped Files, Internal Error 200702251 ???

Beitrag von theo »

laz847 hat geschrieben: Vielleicht hast Du ja nochmal Erbarmen,
Erbarmen hilft da nicht, da musst du William Henry Gates III fragen. Ich bin auf Linux. :D
Soweit ich weiss, mappen die Funktionen ohne W und A auf A. Also wäre OpenFileMapping das Gleiche wie OpenFileMappingA.
Kannst ja mal OpenFileMappingW testen. Glaube ich aber eher nicht, hat wohl eher was mit Rechten zu tun. Keine Ahnung.

laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

Re: Memory Mapped Files, Internal Error 200702251 ???

Beitrag von laz847 »

Danke Dir wirklich ganz doll :wink:

Code: Alles auswählen

function OpenFileMapping(dwDesiredAccess:DWORD; bInheritHandle:WINBOOL; lpName:LPCSTR):HANDLE; external 'kernel32' name 'OpenFileMappingA';  
function OpenFileMappingA(dwDesiredAccess:DWORD; bInheritHandle:WINBOOL; lpName:LPCSTR):HANDLE; external 'kernel32' name 'OpenFileMappingA';
function OpenFileMappingW(dwDesiredAccess:DWORD; bInheritHandle:WINBOOL; lpName:LPCWSTR):HANDLE; external 'kernel32' name 'OpenFileMappingW'; 
An LPCSTR is a 32-bit pointer to a constant null-terminated string of 8-bit Windows (ANSI) characters.

Und OpenFileMapping = OpenFileMappingA....

Code: Alles auswählen

MQL4
int OpenFileMappingA(int dwDesiredAccess, bool bInheritHandle, >>>>>>>>>>>> string lpName);
int CreateFileMappingA(int hFile, int lpAttributes, int flProtect, int dwMaximumSizeHigh, int dwMaximumSizeLow, >>>>>>>>>>>> string lpName);
string szName  = "PriceMap1000";
hMapFile = CreateFileMappingA(INVALID_HANDLE_VALUE,0,PAGE_READWRITE,0,BUF_SIZE,>>>>> szName);
A text string is a sequence of characters in the Unicode format with the final zero at the end of it. A string constant can be assigned to a string variable. A string constant is a sequence of Unicode characters enclosed in double quotes.

Code: Alles auswählen

Lazarus ---> hMapFile:=OpenFileMapping(FILE_MAP_READ,False, >>>> PChar('PriceMap1000'));
Ich habe nen Server & Client in Mql 4, die funktionieren. Der szName ist im MQL4 ein Unicode String, ich habe mich schon gewundert warum die noch funktionieren auch wenn man beim Server z.B. "PriceMap1000" und beim Clienten "PriceMap1500" macht. Macht man aber "PriceMap1000" und "QriceMap1000" gehts nicht mehr. Kann es sein das der MT4 (weil Unicode String) eine Map nicht wirklich mit dem Namen sondern irgendwie falsch erstellt? Das würde dann auch erklären warum ich nichts, weder Pipes noch MMF aus dem MT4 >>> Lazarus irgendwie zum laufen bekommen habe!?!

Und wie ist es nun richtig? Nutze ich alles mit W oder mit A, Lazarus ist Ansi, der MT4 Uni. So ein Chaos :evil:

Also Du liegst wieder richtig, habe alles aus W umgestellt und nun finde ich mit Lazarus schon mal das Handle und kann den ersten Buchstaben sehen :D Jup jetzt findet der Client den Server auch nur noch wenn die korrekte Bezeichnung drin ist. Also hat der OpenFileMapping den Namen als Unicode Pointer übertragen, deswegen findet man den mitm Anstring Name dann nicht :P?
Zuletzt geändert von laz847 am Fr 27. Jun 2014, 18:38, insgesamt 2-mal geändert.

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Memory Mapped Files, Internal Error 200702251 ???

Beitrag von theo »

laz847 hat geschrieben: Und wie ist es nun richtig? Nutze ich alles mit W oder mit A, Lazarus ist Ansi, der MT4 Uni. So ein Chaos :evil:
Lazarus benutzt UTF-8, also auch Unicode. Nur unterscheidet sich ANSI (Latin1) und UTF-8 nicht für einen Text wie "PriceMap1000", wohl aber für z.B. "äöü1000".
UTF-8 kann man in WideString (UnicodeString) umwandeln durch UTF8Decode(s);

laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

Re: Memory Mapped Files, Internal Error 200702251 ???

Beitrag von laz847 »

Ähhh :P. Hab genau mit den ganzen Ansi, Uni, UTF8, PChar, Pointer, Adressen noch so meine Probleme. Weil da aber auch jeder seine eigene Suppe kocht, mal heißt es so, mal so, dann wieder ganz anders man man.. Warum gibts nicht einfach Long, Double, String und gut is :P Double und String reichen, wenn hinterm Komma nix is, is da eben nix.. Ich verzichte auch auf äöü :D

Code: Alles auswählen

pBuf := MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0); 
Ok hab das Handle mit OpenFileMappingW, pBuf ist ja der Pointer zu den Daten, wie lese ich - byteweise oder in Blöcken?

Ich werde das MMF auf 2 Arten nutzen, viele kleine mit ShortStrings, die sind für kurze Messages da reichen 255 Zeichen locker. Und dann einige für grosse Datenmengen, diese werden entweder ein Array[>100000][6rec] mit Records (ca. 60 byte) oder aber ca. 6 einzelne Float Array[>100.000] enthalten.

Was ist sinnvoller Array[>100000][6rec] <<---------->> 6 einzelne Float Array[>100.000] ???

Wie bereitet man Daten richtig vor damit Sie auf diese Weise ohne grosse Umwandlungen übertragen werden, kann ich mit Stringketten arbeiten, ist das ungünstig? Theoretisch könnte ich ja bis zu 2 GB(?) Strings verketten und auf der anderen Seite exploden. Aber Stringoperationen sind nicht gerade schnell. Sollte ich lieber alles irgendwie zusammenpacken, in nem Record (packed?) oder wie macht man das, wie sind Eure Erfahrungen?

laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

Re: Memory Mapped Files, Internal Error 200702251 ???

Beitrag von laz847 »

Achtung hat sich erledigt, es geht!! Ich habe keine Ahnung was los war habe neu gestartet und beim probieren mit selbst gewählten Grössen ging es auf einmal, nun funktioniert aber auch der exakt selbe Code wie zuvor!!! Kein Problem mehr mit dem Stack, evtl. habe ich gestern beim Testen etwas zerschossen?

Code: Alles auswählen

2014.06.28 11:38:55.569	MapServer CADJPY,M1: copied 40000 of 41384 bars @ 2 ms | ArraySize 40000 | 40000 * 60 byte  --> BUF_SIZE 2400000
2014.06.28 11:38:54.556	MapServer CADJPY,M1: copied 40000 of 41384 bars @ 4 ms | ArraySize 40000 | 40000 * 60 byte  --> BUF_SIZE 2400000
2014.06.28 11:38:53.554	MapServer CADJPY,M1: copied 40000 of 41384 bars @ 2 ms | ArraySize 40000 | 40000 * 60 byte  --> BUF_SIZE 2400000
2014.06.28 11:38:51.556	MapServer CADJPY,M1: copied 40000 of 41384 bars @ 4 ms | ArraySize 40000 | 40000 * 60 byte  --> BUF_SIZE 2400000 
Riesen dickes fettes Danke !!!!!!!!!!!!!!!!!!!!!!! Das ist der Hammer von der Performance, weit besser als ich es erwartet habe :D :D :D :D

Kommt da Synapse hinterher :D ???

Antworten