Librerie: Mappatura dei file senza DLL - pagina 10

 
o_o:

Almeno non si cerca di leggere un file in memoria dopo aver riavviato il computer...


Quindi mi sembra di capire che non posso trasferire dati in memoria tra due terminali in questo modo?

E qual è il modo corretto? Devo implementare il trasferimento di una stringa di testo da un terminale all'altro utilizzando MemMapLib.mqh.

 
Иван:

Quindi mi sembra di capire che non è possibile trasferire dati attraverso la memoria tra due terminali in questo modo?

è possibile

È necessario implementare il trasferimento di una riga di testo da un terminale all'altro utilizzando MemMapLib.mqh.

creare un file, scriverlo e poi leggerlo.

più o meno in questo ordine

https://www.mql5.com/it/code/10571

 
        CMemMapFile hmem;
        long err=hmem.Open("Local\\test",111,modeCreate);

Qual è la quantità massima di dati che posso scrivere in un file aperto in memoria e poi leggere?

Dopo 4096 l'Expert Advisor inizia a bloccarsi a questo punto.

 
Dammi il codice e la stampa
[Eliminato]  
HANDLE64 CMemMapFile::Open(LPTSTR path, DWORD size, int mode=modeOpen) 
{ 
m_size=size; m_path=path; m_mode=mode; m_pos=0; // начальное положение 
if (m_path=="") return(-1); 
m_hmem=Open(m_path, size, mode, err); 
if (m_hmem==NULL) return(err); // если ошибка создания 
return(0); 
} 

Ciao, nel codice sopra "return(0)" dovrebbe essere corretto in "return(m_hmem)", altrimenti non restituisce l'handle del file mappato in memoria.

 

Ho provato a scrivere una stringa di 200 caratteri in un file e ho ricevuto un errore di superamento della dimensione dell'array alla riga 214 della libreria. Risulta che la dimensione dell'intestazione non viene presa in considerazione quando si determina la dimensione dell'array ricevente.

 
Алексей Барбашин:

Funziona.

non funziona.

Dammi il codice e il mandrino

 
o_o:

Non funziona.

Dammi il codice e la stampa


   string control_text = "La nostra mamma piange forte perché tutti mangiano a sbafo. Zitta mamma, non piangere! Gli altri hanno la stessa schifezza...".;
   string NAME_MAPPING = "Local\\" + Symbol() + "_" + (string)ChartID();
        
   uchar Data_sender[];
   int size_data = StringToCharArray(control_text, Data_sender);

  //--- Creare un oggetto di memoria
   CMemMapFile* MappingFile = new CMemMapFile();
  //--- Creare un file per la registrazione
   long err = MappingFile.Open(NAME_MAPPING, size_data+4, modeCreate);
        
  //--- Scrivere i dati sul file
   err = MappingFile.Write(Data_sender, size_data);
        
  //--- Chiudere il record
   MappingFile.Close();
  //--- Cancellare il puntatore
   delete MappingFile;
   
   uchar Data_receiver[];
   ArrayResize(Data_receiver, size_data);
   
   //--- Creare un oggetto di memoria
   CMemMapFile* MF = new CMemMapFile();
   //--- Aprire il file per la lettura
   err = MF.Open(NAME_MAPPING, size_data+4, modeOpen);
   //--- Сдвигаем указатель чтения на начало файла
   MF.Seek(0,SEEK_SET);
   //--- Читаем данные из файла
   err=MF.Read(Data_receiver, size_data);
   //--- Chiudere il file 
   MF.Close();
  //--- Cancellare il puntatore
   delete MF;

   Print(CharArrayToString(Data_receiver));

Ho capito le dimensioni. Ma ho provato a leggere il file con un altro oggetto e ho ottenuto il silenzio sull'output. Dov'è l'errore?

 
Алексей Барбашин:

Ho capito le dimensioni. Ma ho provato a leggere il file con un altro oggetto e ho ottenuto il silenzio in uscita. Dov'è l'errore?

//--- Chiudere il record

Non si chiama chiusura di un record, ma chiusura ed eliminazione di un file.

Ecco perché

//--- Aprire il file per la lettura
per cui si sta cercando di aprire qualcosa che non esiste.
 
o_o:

non si chiama chiusura del record, ma chiusura e cancellazione del file.

ecco perché

si sta cercando di aprire qualcosa che non esiste.

Ok, questo ha senso. Stavo seguendo l'analogia del lavoro con i file normali, quando la chiusura porta esattamente alla chiusura e al rilascio, non all'eliminazione del file.