Bibliotecas: Mapeamento de Arquivo sem DLL - página 10

 
o_o:

Pelo menos você não tenta ler um arquivo na memória depois de reiniciar o computador...


Então, entendo que não posso transferir dados pela memória entre dois terminais dessa forma?

E qual é a maneira correta? Preciso implementar a transferência de uma string de texto de um terminal para outro usando o MemMapLib.mqh.

 
Иван:

Então, entendo que não posso transferir dados pela memória entre dois terminais dessa maneira?

Você pode

Você precisa implementar a transferência de uma linha de texto de um terminal para outro usando o MemMapLib.mqh.

criar um arquivo, gravá-lo e depois lê-lo.

mais ou menos nesta ordem

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

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

Qual é a quantidade máxima de dados que posso gravar em um arquivo aberto na memória e depois ler?

Depois de 4096, o Expert Advisor começa a falhar nesse ponto.

 
Forneça o código e a impressão
[Excluído]  
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); 
} 

Olá, no código acima, "return(0)" deve ser corrigido para "return(m_hmem)", caso contrário, ele não retornará o identificador do arquivo mapeado na memória.

 

Tentei gravar uma cadeia de caracteres de 200 caracteres em um arquivo e recebi um erro por exceder o tamanho da matriz na linha 214 da biblioteca. Acontece que o tamanho do cabeçalho não é levado em conta ao determinar o tamanho da matriz receptora.

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

Está funcionando.

Não está funcionando.

Me dê o código e o fuso

 
o_o:

Não está funcionando.

Dê-me o código e a impressão


   string control_text = "Nossa mamãe está chorando alto porque todos estão comendo muito. Calma, mamãe, não chore! Os outros têm a mesma merda...";
   string NAME_MAPPING = "Local\\" + Symbol() + "_" + (string)ChartID();
        
   uchar Data_sender[];
   int size_data = StringToCharArray(control_text, Data_sender);

  //--- Criar um objeto de memória
   CMemMapFile* MappingFile = new CMemMapFile();
  //--- Criar um arquivo para gravação
   long err = MappingFile.Open(NAME_MAPPING, size_data+4, modeCreate);
        
  //--- Gravar dados no arquivo
   err = MappingFile.Write(Data_sender, size_data);
        
  //--- Feche o registro
   MappingFile.Close();
  //--- Excluir o ponteiro
   delete MappingFile;
   
   uchar Data_receiver[];
   ArrayResize(Data_receiver, size_data);
   
   //--- Criar um objeto de memória
   CMemMapFile* MF = new CMemMapFile();
   //--- Abra o arquivo para leitura
   err = MF.Open(NAME_MAPPING, size_data+4, modeOpen);
   //--- Сдвигаем указатель чтения на начало файла
   MF.Seek(0,SEEK_SET);
   //--- Читаем данные из файла
   err=MF.Read(Data_receiver, size_data);
   //--- Fechar o arquivo 
   MF.Close();
  //--- Excluir o ponteiro
   delete MF;

   Print(CharArrayToString(Data_receiver));

Descobri as dimensões. Mas tentei ler o arquivo com outro objeto e obtive silêncio na saída. Onde está o erro?

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

Descobri as dimensões. Mas tentei ler o arquivo com outro objeto e obtive silêncio na saída. Onde está o erro?

//--- Feche o registro

Isso não se chama fechar um registro, mas sim fechar e excluir um arquivo.

E é por isso que

//--- Abra o arquivo para leitura
você está tentando abrir algo que não existe.
 
o_o:

não se chama fechar o registro, mas sim fechar e excluir o arquivo.

e é por isso que

você está tentando abrir algo que não existe.

Certo, isso faz sentido. Eu estava seguindo a analogia de trabalhar com arquivos comuns, quando o fechamento leva exatamente a fechar e liberar, não a excluir o arquivo.