Memory Mapped Files, Internal Error 200702251 ???

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
laz847
Beiträge: 114
Registriert: Mi 18. Jun 2014, 16:39

Memory Mapped Files, Internal Error 200702251 ???

Beitrag von laz847 »

Ja nun dachte ich, ich habe es geschafft aber irgendwie gehts immer noch nicht :D. Es ist vermutlich nur ein falscher Pointer oder so etwas, bitte verzeiht mir den langen Quelltext aber ich denke mal es ist besser wenn man alles sieht, nicht das der Fehler ganz woanders sitzt ;(

Wenn ich einen normalen Record in ein MMF schreibe geht es, dann kann ich diesen auf der Empfängerseite auslesen. Setze ich aber genau diesen Record in ein Array und versuche das dann zu lesen kriege ich ganz merkwürdige Fehler, Stack Overflows bis zu Debugger abstürzen. Ich poste mal 2 Versionen, die erste mit einfachem Record und die zweite mit Record im Array, was ist da falsch?

Beispiel: http://www.michael-puff.de/Programmieru ... /MMF.shtml

Achtung bei der funktionierenden Version:

Code: Alles auswählen

PRates = ^TRates;
bei der die nicht geht

Code: Alles auswählen

Rates  = Array[0..MaxLongInt div SizeOf(TRates)-1]of TRates;
PRates = ^Rates;
--------- das hier geht ---------------------------------------------------------------------------------------------------------------------------------

Code: Alles auswählen

 ------ (1) der sender --------------------------------------------------------------------------------------------------
 
TRates = packed record
   time        : INT64;
   open        : Double;
   high        : Double;
   low         : Double;
   close       : Double;
   tick_volume : UINT64;
   spread      : INT32;
   real_volume : UINT64;
  end; 
 
  PRates = ^TRates;
 
function WriteToMMF(MyData: PRates; Filename: string; hWnd: THandle): DWORD;
var
  dwResult: DWORD;
  hFileMapping: THandle;
  Mem: PRates;
begin
  Mem          := nil;
  dwResult     := 0;
  hFileMapping := CreateFileMapping(INVALID_HANDLE_VALUE, nil,PAGE_READWRITE,0,sizeof(TRates),PChar(Filename));
  if hFileMapping <> 0 then begin
    Mem := MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);
    if Assigned(Mem) then begin
     CopyMemory(Mem, MyData, sizeof(TRates));
     SendMessage(hWnd, WM_MMFNOTIFY, 0, 0);
     CloseHandle(hFileMapping);
    end;
  end else dwResult := GetLastError;
  result := dwResult;
end;
 
function MT4_IPC_Send(const _msg:PWideChar; const _qac:Integer;var _MyQuotes:PQuotes;const _rac:Integer;var _Rates:Rates):boolean;stdcall;
var
 res,i    : integer;
 dwResult : DWORD;
 hReceiver: THandle;
 MyData   : PRates;
begin
 SetLastError(0);
 hReceiver := FindWindow(nil, 'TReceiver');
 if hReceiver <> 0 then begin
    MyData := GetMemory(SizeOf(TRates));
    try
      if Assigned(MyData) then begin
        MyData^.time       := 1;
        MyData^.open       :=2;
        MyData^.high       :=3;
        MyData^.low        :=4;
        MyData^.close      :=5;
        MyData^.tick_volume:=6;
        MyData^.spread     :=7;
        MyData^.real_volume:=8;
        dwResult := WriteToMMF(MyData,'MyFileMapping',hReceiver);
        if dwResult <> ERROR_SUCCESS then TCPxHnd.IpcLog(SysErrorMessage(dwResult));
      end;
    finally
      FreeMemory(MyData);
    end;
  end else TCPxHnd.IpcLog(SysErrorMessage(GetLastError));
 exit(true);
end; 
------ (2) der empfänger --------------------------------------------------------------------------------------------------
 
    TRates = packed record
     time        : INT64;
     open        : Double;
     high        : Double; 
     low         : Double;
     close       : Double;
     tick_volume : UINT64; 
     spread      : INT32; 
     real_volume : UINT64; 
    end;  
 
    PRates = ^TRates;
 
function ReadFromMMF(Filename: string): TRates;
var
  hFileMapping: THandle;
  Mem: PRates;
begin
  hFileMapping := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READONLY, 0, sizeof(TRates), PChar(Filename));
  if hFileMapping <> 0 then begin
    Mem := MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
    if Assigned(Mem) then begin
      result.time        := mem^.time;
      result.open        := mem^.open;
      result.high        := mem^.high;
      result.low         := mem^.low;
      result.close       := mem^.close;
      result.tick_volume := mem^.tick_volume;
      result.spread      := mem^.spread;
      result.real_volume := mem^.real_volume;
    end;
  end
end;
 
procedure TTReceiver.WMMMFNOTIFY(var msg: TMessage);
var
  MyData: TRates;
begin
  MyData     := ReadFromMMF('MyFileMapping');
  Edit1.Text := IntToStr  (MyData.time);
  Edit2.Text := FloatToStr(MyData.open);
  Edit3.Text := FloatToStr(MyData.high);
  Edit4.Text := FloatToStr(MyData.low);
  Edit5.Text := FloatToStr(MyData.close);
  Edit6.Text := IntToStr  (MyData.tick_volume);
  Edit7.Text := IntToStr  (MyData.spread);
  Edit8.Text := IntToStr  (MyData.real_volume);
end;
 
 
--------- das hier geht nicht ---------------------------------------------------------------------------------------------------------------------------------

Code: Alles auswählen

 ------ (3) der sender lässt sich kompilieren und scheint zu gehen --------------------------------------------------------------------------------------------------
 
  TRates = packed record
   time        : INT64;
   open        : Double;
   high        : Double; 
   low         : Double; 
   close       : Double; 
   tick_volume : UINT64;  
   spread      : INT32; 
   real_volume : UINT64; 
  end;           
 
  Rates  = Array[0..MaxLongInt div SizeOf(TRates)-1]of TRates;
  PRates = ^Rates;
 
function WriteToMMF(MyData: PRates; Filename: string; hWnd: THandle): DWORD;
var
  dwResult: DWORD;
  hFileMapping: THandle;
  Mem: PRates;
begin
  Mem          := nil;
  dwResult     := 0;
  hFileMapping := CreateFileMapping(INVALID_HANDLE_VALUE, nil,PAGE_READWRITE,0,SizeOf(Rates),PChar(Filename));
  if hFileMapping <> 0 then begin
    Mem := MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);
    if Assigned(Mem) then begin
     CopyMemory(Mem,MyData,SizeOf(Rates));
     SendMessage(hWnd, WM_MMFNOTIFY, 0, 0);
     CloseHandle(hFileMapping);
    end;
  end else dwResult := GetLastError;
  result := dwResult;
end;
 
function MT4_IPC_Send(const _rac:Integer;var _Rates:Rates):boolean;stdcall;
var
 res,i    : integer;
 dwResult : DWORD;
 hReceiver: THandle;
 MyData   : PRates;
begin
 SetLastError(0);
 hReceiver := FindWindow(nil, 'TReceiver');
 if hReceiver <> 0 then begin
    MyData := GetMemory(SizeOf(Rates));
    try
      if Assigned(MyData) then begin
        MyData^[0].time        := 1;
        MyData^[0].open        := 2;
        MyData^[0].high        := 3;
        MyData^[0].low         := 4;
        MyData^[0].close       := 5;
        MyData^[0].tick_volume := 6;
        MyData^[0].spread      := 7;
        MyData^[0].real_volume := 8;
        dwResult               := WriteToMMF(MyData,'MyFileMapping',hReceiver);
        if dwResult <> ERROR_SUCCESS then TCPxHnd.IpcLog(SysErrorMessage(dwResult));
      end;
    finally
      FreeMemory(MyData);
    end;
  end else TCPxHnd.IpcLog(SysErrorMessage(GetLastError));
 exit(true);
end; 
------ (4) der empfänger --------------------------------------------------------------------------------------------------
 
    TRates = packed record
     time        : INT64; 
     open        : Double; 
     high        : Double;
     low         : Double;  
     close       : Double; 
     tick_volume : UINT64; 
     spread      : INT32; 
     real_volume : UINT64; 
    end;      
 
    Rates  = Array[0..MaxLongInt div SizeOf(TRates)-1]of TRates;
    PRates = ^Rates;   
 
function ReadFromMMF(Filename: string): Rates;
var
  hFileMapping: THandle;
  Mem: PRates;
begin
  hFileMapping := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READONLY, 0, SizeOf(Rates), PChar(Filename));
  if hFileMapping <> 0 then begin
    Mem := MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
    if Assigned(Mem) then begin
      result[0].time        := mem^[0].time;
      result[0].open        := mem^[0].open;
      result[0].high        := mem^[0].high;
      result[0].low         := mem^[0].low;
      result[0].close       := mem^[0].close;
      result[0].tick_volume := mem^[0].tick_volume;
      result[0].spread      := mem^[0].spread;
      result[0].real_volume := mem^[0].real_volume;
    end;
  end;
end;
 
procedure TTReceiver.WMMMFNOTIFY(var msg: TMessage);
var
  MyData: Rates;
begin
  MyData := ReadFromMMF('MyFileMapping');
  Edit1.Text := IntToStr   (MyData[0].time);
  Edit2.Text := FloatToStr (MyData[0].open);
  Edit3.Text := FloatToStr (MyData[0].high);
  Edit4.Text := FloatToStr (MyData[0].low);
  Edit5.Text := FloatToStr (MyData[0].close);
  Edit6.Text := IntToStr   (MyData[0].tick_volume);
  Edit7.Text := IntToStr   (MyData[0].spread);
  Edit8.Text := IntToStr   (MyData[0].real_volume);
end;   
 
 
Empfänger (4) lässt sich so nicht kompilieren, obwohl es so stimmen sollte oder???

"unit2.pas(77,1) Fatal: Internal error 200702251"

Alles was ich da jetzt versuche führt zu Abstürzen, geht soweit das selbst der Debugger abstürzt, die Version die meiner Meinung nach kompilieren müsste tuts aber nicht mit diesem komischen Fehler?

Vielen lieben Dank ;)
Zuletzt geändert von laz847 am Mi 25. Jun 2014, 17:16, insgesamt 3-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 »

Tja, wo Stack Overflow drauf steht ist wahrscheinlich auch Stack Overflow drin. :wink:
Es gab hier mal ein Thema dazu: http://www.lazarusforum.de/viewtopic.php?f=12&t=687
Sonst Googlen.

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

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

Beitrag von laz847 »

Der hat 16 G Ram, habe mal die 2 Befehle probiert:
[user@lazarus ~]$ ulimit -s
8192
[user@lazarus ~]$ ulimit -d
unlimited

Du denkst das das Array den Stack Overflow auslöst?? Ich verwende genau den selben Record mit exakt dem selbem MqlRates Array
bereits in anderen dll's??? Diese kompilieren, laden das Array und berechnen zum Beispiel einen MovingAverage aus allen Arrayelementen.

Code: Alles auswählen

Rates  = Array[0..MaxLongInt div SizeOf(TRates)-1]of TRates;
Aber Du hast Recht, wie es aussieht....

Rates = Array[0..MaxLongInt div SizeOf(TRates)-1]of TRates; ----> unit2.pas(77,1) Fatal: Internal error 200702251

Rates = Array[0..1000000]of TRates; ---------> kompiliert ?????

Das kann doch nicht wahr sein, theo ick drück da ich muss mal fix testen..... :D

Was ist das denn für eine Sch :oops: der Stackoverflow kommt jetzt eben gerade nicht deswegen hatte ich das Array icht wirklich verdächtigt.

Könnte man ja auch mal irgendwas "Out of Range" anzeigen anstatt "error 200702251" :lol: :lol: :lol:

Ich teste brb....
Zuletzt geändert von laz847 am Mi 25. Jun 2014, 16:42, 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: Du denkst das das Array den Stack Overflow auslöst??
Wäre doch logisch, oder? Hast du's denn mal kleiner gemacht?

Z.B.
Rates = Array[0..100]of TRates;

EDIT: Sry, dein Edit war schneller.

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

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

Beitrag von laz847 »

Dann weiß ich jetzt auch warum das ganze andere Zeugs mit TCP nicht geklappt hat, ich flipp aus :D

bin mal paar Minuten weg, muss das jetzt nochmal testen :D

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

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

Beitrag von laz847 »

Hmmm neee :( :( :( :(

Also die Änderung des Arrays hat zwar den komischen Fehler 2007xxxx behoben und ich konnte dann den Empfänger so kompilieren wie er meiner Meinung nach richtig ist. Starte ich den Server und dann den Client geht der Server einfach aus, ohne irgendwas. Starte ich den Server während der Client schon läuft stürzt der Client StackOverflow ab :evil: :evil: :evil:

Der Sender:

Code: Alles auswählen

TRates = packed record
   time        : INT64;
   open        : Double;
   high        : Double;
   low         : Double; 
   close       : Double;  
   tick_volume : UINT64;  
   spread      : INT32; 
   real_volume : UINT64; 
  end; 
  Rates  = Array[0..1000000] of TRates;
  PRates = ^Rates;        
 
function WriteToMMF(MyData: PRates; Filename: string; hWnd: THandle): DWORD;
var
  dwResult: DWORD;
  hFileMapping: THandle;
  Mem: PRates;
begin
  Mem          := nil;
  dwResult     := 0;
  hFileMapping := CreateFileMapping(INVALID_HANDLE_VALUE, nil,PAGE_READWRITE,0,SizeOf(Rates),PChar(Filename));
  if hFileMapping <> 0 then begin
    Mem := MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);
    if Assigned(Mem) then begin
     CopyMemory(Mem,MyData,SizeOf(Rates));
     SendMessage(hWnd, WM_MMFNOTIFY, 0, 0);
     CloseHandle(hFileMapping);
    end;
  end else dwResult := GetLastError;
  result := dwResult;
end;
 
function MT4_IPC_Send(const _msg:PWideChar; const _qac:Integer;var _MyQuotes:PQuotes;const _rac:Integer;var _Rates:Rates):boolean;stdcall;
var
 res,i    : integer;
 dwResult : DWORD;
 hReceiver: THandle;
 MyData   : PRates;
begin
 SetLastError(0);
 hReceiver := FindWindow(nil, 'TReceiver');
 if hReceiver <> 0 then begin
    MyData := GetMemory(SizeOf(Rates));
    try
      if Assigned(MyData) then begin
        MyData^[0].time        := 1;
        MyData^[0].open        := 2;
        MyData^[0].high        := 3;
        MyData^[0].low         := 4;
        MyData^[0].close       := 5;
        MyData^[0].tick_volume := 6;
        MyData^[0].spread      := 7;
        MyData^[0].real_volume := 8;
        dwResult               := WriteToMMF(MyData,'MyFileMapping',hReceiver);
        if dwResult <> ERROR_SUCCESS then TCPxHnd.IpcLog(SysErrorMessage(dwResult));
      end;
    finally
      FreeMemory(MyData);
    end;
  end
  else TCPxHnd.IpcLog(SysErrorMessage(GetLastError));
 exit(true);
end;
 
Der Empfänger

Code: Alles auswählen

   TRates = packed record
     time        : INT64;  
     open        : Double;
     high        : Double; 
     low         : Double; 
     close       : Double; 
     tick_volume : UINT64;  
     spread      : INT32;  
     real_volume : UINT64;  
    end;  
 
    Rates  = Array[0..1000000]of TRates;
    PRates = ^Rates;   
 
function ReadFromMMF(Filename: string): Rates;
var
  hFileMapping: THandle;
  Mem: PRates;
begin
  hFileMapping := CreateFileMapping(INVALID_HANDLE_VALUE,nil,PAGE_READONLY,0,SizeOf(Rates),PChar(Filename));
  if hFileMapping <> 0 then begin
    Mem := MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
    if Assigned(Mem) then begin
      result[0].time        := mem^[0].time;
      result[0].open        := mem^[0].open;
      result[0].high        := mem^[0].high;
      result[0].low         := mem^[0].low;
      result[0].close       := mem^[0].close;
      result[0].tick_volume := mem^[0].tick_volume;
      result[0].spread      := mem^[0].spread;
      result[0].real_volume := mem^[0].real_volume;
    end;
  end;
end;
 
procedure TTReceiver.WMMMFNOTIFY(var msg: TMessage);
var
  MyData: Rates;
begin
  MyData     := ReadFromMMF('MyFileMapping');
  Edit1.Text := IntToStr   (MyData[0].time);
  Edit2.Text := FloatToStr (MyData[0].open);
  Edit3.Text := FloatToStr (MyData[0].high);
  Edit4.Text := FloatToStr (MyData[0].low);
  Edit5.Text := FloatToStr (MyData[0].close);
  Edit6.Text := IntToStr   (MyData[0].tick_volume);
  Edit7.Text := IntToStr   (MyData[0].spread);
  Edit8.Text := IntToStr   (MyData[0].real_volume);
end;

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

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

Beitrag von theo »

Warum musst du denn überhaupt so ein Mörder Array verwenden?

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

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

Beitrag von laz847 »

Dieses Array wird vom MT4 mit historischen Daten befüllt, es gibt also diese Structur Mqlrates und pro Kerze im Chart hat man einen Record. Zur Auswertung der Daten nutzt man natürlich teilweise sehr viele Einträge, wenn man Minutenkerzen lädt sind das schnell mal > 100.000.

Genaueres zur Structur findest Du hier:
http://www.mql5.com/en/docs/constants/s ... s/mqlrates

Die Funktion mit der das Array gefüllt wird:
http://www.mql5.com/en/docs/series/copyrates
When copying the yet unknown amount of data, it is recommended to use dynamic array as a target array, because if the requested data count is less (or more) than the length of the target array, function tries to reallocate the memory so that the requested data fit entirely. If you know the amount of data you need to copy, it should better be done to a statically allocated buffer, in order to prevent the allocation of excessive memory. No matter what is the property of the target array - as_series=true or as_series=false. Data will be copied so that the oldest element will be located at the start of the physical memory allocated for the array. ...

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

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

Beitrag von theo »

Da du ja eh immer wieder nach neuen Wegen suchst:
Ich habe dir hier mal eine fortgeschrittenen Echo Demo mit Synapse hochgeladen:

http://theowp.bplaced.net/upload/syna_echo_test.zip

Der Code ist bald 10 Jahre alt. Ich hatte ihn damals für einen Test für Delphi/Kylix geschrieben, und soeben für Lazarus angepasst.

Oben ist der Server -> Listen
Unten ist der Client -> Send (Host anpassen)
Man kann nat. auf einem Rechner den Server und auf einem anderen Rechner den Client laufen lassen.

Dann siehst du unten (Comm. per second) wie viele Echos so pro Sekunde möglich sind.
Der Server ist Muli-Threaded.
Der Code verwendet meinen DataPacker, damit kann man sehr einfach beliebige Daten auf den Stream schicken.

Vllt. hilft's dir, und vllt. verwirrt es dich.
Benötigt noch Synapse http://sourceforge.net/p/synalist/code/HEAD/tree/trunk/

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

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

Beitrag von laz847 »

Ok vielen Dank das wird dann mein letzter Ausweg wenn ich das hier nicht schaffe, es würde mich allerdings etwas abnerven :D... Allerdings wird das vom Speed her nicht so schnell sein wie MMF oder? Ich hab keine Vorstellung davon was max. per TCP möglich ist? Wenn es tatsächlich irgendwie am Array liegt dann wäre auch klar warum es per TCP nicht ging, da hatte ich das selbe Problem, einzelne Datensätze ok, mit mehr dann nur Probleme.

Kannst Du trotzdem bitte bitte nochmal schauen, ich denke es ist nur eine Kleinigkeit dann würde das laufen, ich habe ja wie gesagt schon Daten übertragen, wenn ich einen einzelnen Record nehme geht das ohne Probleme, es kann doch nicht sein das man damit kein Array speichern kann?
Zuletzt geändert von laz847 am Mi 25. Jun 2014, 17:40, 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 »

Falls du es schon gedownloadet hast, da hat eine Datei gefehlt, ist jetzt drauf.

Geschwindigkeit: Ich komme auf Linux localhost damit auf 38'000 Echos pro Sekunde bei 32 Bytes Datengrösse.
Ist ja nicht soo wenig.

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

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

Beitrag von laz847 »

Hmm im Sender in der WriteToMMF() mache ich CopyMemory(Mem,MyData,SizeOf(Rates));

MyData ist bisher nur auf [0] beschrieben es wird aber auf SizeOf(Rates) kopiert, macht das etwas aus?

PS: Danke übrigens aber bitte nicht mißverstehen, ich denke MMF ist TCP weit überlegen, ich habe von mehreren GB/s gelesen. Da meine Lösung mit einem einzelnen Record geht, mit einem Array of den selben Records aber noch nicht, denke ich die Lösung kann ja nicht so weit weg liegen. Sollte ich wirklich nicht weiterkommen, würde ich gern Dein Projekt nutzen, dann kann ich aber alles MMF + TCP aus meinem Projekt wieder ausbauen, bis dann alles implementiert ist, dauert auch wieder seine Zeit :roll:.

Also gern aber ich denke Du bist fit genug und findest das auch, am Ende schreib ich in den MMF und lese wieder raus, kann doch nicht sein das wir das nicht finden und zu einer Alternative fliehen müssen :lol:

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

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

Beitrag von laz847 »

Ich glaub es nicht es liegt noch immer am Array.... Kannst Du Dir mal bitte den Empfänger in eine Form werfen und starten, der geht dann sofort wieder aus, hab jetzt mal mit dem Array getestet, bei 100.000 kann ich die exe starten, bei 1 000 000 nicht! Bis Rates = Array[0..270000]of TRates; startet die exe, ab 280.000 nicht mehr :shock: Und es sieht so aus als wenn Daten ankommen :D

Also wenn ich den Sender ohen Empfänger starte läuft er bis dieser gestartet wird, dann findet er ihn und beim Schreibem in den MMF kommts zu einer AV, da stimmt also schonmal was nicht:

Code: Alles auswählen

im sender
 
  Rates  = Array[0..100000] of TRates;
  PRates = ^Rates;  
 
     if Assigned(MyData) then begin
      TCPxHnd.IpcLog('Assigned MyData');
      for i:=0 to 2 do begin
        MyData^[i].time        := 1;
        MyData^[i].open        := 2;
        MyData^[i].high        := 3;
        MyData^[i].low         := 4;
        MyData^[i].close       := 111111;
        MyData^[i].tick_volume := 6;
        MyData^[i].spread      := 7;
        MyData^[i].real_volume := 8;
      end;
 
       TCPxHnd.IpcLog('loop done');
        dwResult:=WriteToMMF(MyData,'MyFileMapping',hReceiver);
         TCPxHnd.IpcLog('WriteToMMF done');
       if dwResult <> ERROR_SUCCESS then TCPxHnd.IpcLog(SysErrorMessage(dwResult));    
 
-------------------------------------
hReceiver found
Assigned MyData
loop done
Irgendwie konnte der Empfänger aber zwischendurch etwas lesen, die Zahlen 1-8 standen in den Edits ;)

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 »

Wieso nimmt du keine dynamische Array, anstelle mit Pointers zu handtieren ?
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 »

Habs, jetzt gehts, offenbar hat das Map-File nen Schaden, hab alles nochmal so gemacht wie es ok sein sollte und dann das Map-File umbenannt, plötzlich konnte der Client wieder in den MMF schreiben.

@Mathias Ich hatte das aus dem Beispiel erstmal so übernommen, solange es noch nicht geht wollte ich da noch nichts umbauen dran und das sich das so verstrickt hätte ich nicht erwartet :D

Geht das auch alles komplett ohne Pointer genauso?

Wo ist der Vorteil, ist es nicht schneller in der Verarbeitung nur mit Pointern zu arbeiten?

Muss man das MMF freigeben, was passiert mit dem defekten Teil?

Antworten