Escrevendo para o arquivo em uma nova linha - página 6

 
Aleksei Stepanenko:
Sergei tem vários Expert Advisors trabalhando lá, há várias filas, então é uma matriz. E é por isso que tudo parece feio. Maxim Kuznetsov sugeriu SQL, esta é a maneira correta para que estes EAs se comuniquem entre si.

Mas as linhas são lidas uma de cada vez e de alguma forma a linha certa é selecionada. E então você não precisa de uma matriz.

Eu também disse isso, mas o mql4 não suporta SQLite

 

Eu não liguei a biblioteca? Ou não estava lá, eu esqueci.

 
Aleksei Stepanenko:

Eu não liguei a biblioteca? Ou não estava lá, eu esqueci.

Parece que não é possível editar um arquivo juntos ao mesmo tempo, porque a versão do arquivo que foi salva mais tarde é salva.

Por exemplo, o programa A abriu o arquivo para edição, ao mesmo tempo o programa B fez o mesmo, depois o programa A fez as mudanças e as salvou usando FileClose, depois o programa B fez o mesmo, mas quando o programa C abre o arquivo, ele não mostrará as mudanças feitas pelo programa A, mas somente as mudanças que foram implementadas e salvas pelo programa B, porque o programa B salvou o arquivo mais tarde que o programa A.

Mas isto não é certo.

Existe alguma informação sobre isso?

 
O trabalho simultâneo de programas com um arquivo é o pior dos males. Ao trabalhar em um arquivo, um EA deve controlar a proibição de outros EA de ler/escrever esse arquivo. Use SQL ou flag-globalvariable ou flag-file. Caso contrário, haverá erros incompreensíveis que são difíceis de detectar.
 
Aleksei Stepanenko:
O trabalho simultâneo de programas com um arquivo é o pior dos males. No momento de trabalhar com o arquivo, o Consultor Especialista deve controlar a proibição de leitura/escrita deste arquivo por outros Consultores Especialistas. Usar SQL ou arquivo devariável global ou arquivo de bandeira. Caso contrário, haverá erros incompreensíveis que são difíceis de detectar.

Não é assim tão mau, existem todos os tipos de tarefas, basta levar em conta certas peculiaridades.

Aparentemente, as mudanças são salvas exatamente no momento do FileClose, e ninguém está ciente delas até então.

 
A decisão é sua. O cérebro humano é construído de tal forma que novas idéias são difíceis de serem encontradas.
 
EfremovSergey:

Parece que não é possível editar um arquivo juntos ao mesmo tempo, porque a versão do arquivo que foi salva mais tarde é salva.

Por exemplo, o programa A abriu o arquivo para edição, ao mesmo tempo o programa B fez o mesmo, depois o programa A fez alterações e as salvou usando FileClose, depois o programa B fez o mesmo, mas quando o programa C abre o arquivo, o arquivo não conterá as alterações feitas pelo programa A, mas somente as alterações que o programa B fez e salvou, porque o programa B salvou mais tarde que o programa A.

Mas isto não é certo.

Existe alguma informação sobre isso?

É difícil configurá-lo, mas não impossível. Basta verificar, antes de economizar, a hora da última mudança com o mesmo tempo quando você a abre. Nós lemos FILE_MODIFY_DATE, depois abrimos o arquivo, fazemos alterações, lemos FILE_MODIFY_DATE novamente ,comparamos com o anterior e se ninguém fez alterações, fechamos o arquivo e salvamos as alterações. Caso contrário, descartamos as mudanças... e a abrimos novamente. Assim.

 
EfremovSergey:

Não é que o mal, as tarefas são diferentes, mas existem certas peculiaridades que precisam ser levadas em conta.

Aparentemente, as mudanças são salvas no momento do FileClose, e ninguém está ciente delas até então.

Não é um fato.

FileFlush

Redefinir para disco todos os dados restantes no buffer de E/S do arquivo.

void  FileFlush( 
   int  file_handle      // handle файла 
   );
 
Alexey Viktorov:

Difícil de se estabelecer, mas não impossível. É suficiente verificar, antes de escrever, a hora da última mudança com o mesmo tempo quando você a abre. Isto é, leia FILE_MODIFY_DATE, depois abra o arquivo, faça alterações, novamente leia FILE_MODIFY_DATE compare com o anterior e se ninguém fez alterações, feche o arquivo salvando as alterações. Caso contrário, descartamos as mudanças... e a abrimos novamente. Assim.

É mais ou menos o mesmo que bandeira "ocupada" (primeiro a ser servido), só que vezes mais complicada, mas a idéia é interessante, eu gosto dela, obrigado.

 
Alexey Viktorov:

Não é um fato.

FileFlush

Redefinir para disco quaisquer dados restantes no buffer de E/S do arquivo.

Não tenho certeza do que isso significa no contexto do FileClose save.