Аналог мьютекса для записи-чтения файла - страница 4

 
Alexey Volchanskiy:
Разумеется, этот флаг стоит. Но он означает лишь то, что несколько программ могут одновременно читать или писать в файл. К атомарным локировкам это отношения не имеет.

шта?

проблема, а что, если мастер еще не все записал, а слейвы уже начали читать?

FILE_SHARE_READ должно решить проблему


для особо ленивых

"кто умеет читать, тот имеет преимущество" https://www.mql5.com/ru/forum/34503

Вопрос по mql5 (запись в файл/чтение из файла)
Вопрос по mql5 (запись в файл/чтение из файла)
  • www.mql5.com
Решил разобраться в mql5 функциями записи в файл и чтения из файла. - - Категория: общее обсуждение
 
Rustamzhan Salidzhanov:

   ничего подобного.

  1) каждый слейв при установке пишет файл со своим именем, или вписывает в общий файл строку со своим именем.

  2) как только мастер находит нового слева создает для него датафайл и пишет туда данные

  3) слейв читает их удаляет данные\файл

  4) мастер видит чистый файл\отсутствие файла - пишет новый, пишет новую порцию данных 

  5) каждый слейв при удалении удаляет свой файл\строку в общем файле

  Преимущество - мастер всегда знает количество слейвов, и если слейв не отвечает может просигналить... и т.д. и т.п. 

Очень интересное решение. В этом что-то есть. Надо будет взять на заметку!
 
Alexey Volchanskiy:

У меня для каждого слейва отдельный терминал )) Вы что, не поняли, зачем это нужно? Есть 10 инвесторов, у каждого свой счет, соответственно, терминал. Задача - минимизировать нагрузку на процессор. Все тяжелые расчеты делаются на одном терминале, сигналы на открытие позы передаются на другие, а там уже, в зависимости от желания клиента, работает легкая часть принятия решений с индивидуальными настройками и (в будущем) менименеджментом.

Про маркет я писал потому, что хочется зарезервировать такую возможность.

Задача решена, лучше не сделать.

Rustamzhan Salidzhanov:
  Так они же все на одном компе ? используйте : FILE_COMMON расположение файла в общей папке всех клиентских терминалов \Terminal\Common\Files

Думаю это тот самый случай, когда удаленное взаимодействие легче локального.

Алексей, а Вы не задумывались над таким вариантом: слейвы, через WebRequest запрашивают с централизованного сервера результаты расчета. Если по каким-то причинам, расчеты получить не удалось, слейв делает их уже самостоятельно. Взаимодействие с удаленными серверами в Маркете не запрещено, в случае выключения сервера - нагрузка перекладывается на компьютер пользователя. В общем настоящие облачные вычисления, красота!

 
Vasiliy Sokolov:

Думаю это тот самый случай, когда удаленное взаимодействие легче локального.

Алексей, а Вы не задумывались над таким вариантом: слейвы, через WebRequest запрашивают с централизованного сервера результаты расчета. Если по каким-то причинам, расчеты получить не удалось, слейв делает их уже самостоятельно. Взаимодействие с удаленными серверами в Маркете не запрещено, в случае выключения сервера - нагрузка перекладывается на компьютер пользователя. В общем настоящие облачные вычисления, красота!

Это красиво, но сложно и только для меня. Или придется для покупателей в маркете еще и сервер делать ))
 
o_O:

шта?

FILE_SHARE_READ должно решить проблему


для особо ленивых

"кто умеет читать, тот имеет преимущество" https://www.mql5.com/ru/forum/34503

Для особо внимательных - уже 100500 раз написал, что это флаг стоит изначально, я не новичок. Короче, сделал так - все работает. И FILE_SHARE_READ не имеет ни малейшего отношения к моему вопросу о синхронизации.

enum EMasterSlave {EMaster, ESlave, ENone, EEnd};

extern EMasterSlave MasterSlave = ENone;

int CommandFile = -1;  // common файл для записи команд от Master к Slave

bool OpenLogFiles()
{
    bool result = true;
    FileClose(CommandFile); // на всякий случай..
    CommandFile = -1;
    switch(MasterSlave)
    {
    case EMaster: 
        CommandFile = FileOpen(MasterSlaveFileName + Symbol() + ".shn", FILE_BIN | FILE_WRITE | FILE_SHARE_WRITE | FILE_COMMON);
        break;
    case ESlave: 
        CommandFile = FileOpen(MasterSlaveFileName + Symbol() + ".shn", FILE_BIN | FILE_READ | FILE_SHARE_READ | FILE_COMMON);
        break;
    }
    if(CommandFile > 0)
        Print("CommandFile" + " is opened");
    else
    {
        result = false;
        Print("Error of opening CommandFile");
    }
//***открытие других лог-файлов
    return result;
} 

// упрощенный пример записи одного значения типа 
enum ETradeEnable {EnableAll, EnableBuy, EnableSell, DisableAll};

void WriteCommand(ETradeEnable te)
{
    if(CommandFile > 0)
    {
        FileSeek(CommandFile, 0, SEEK_SET);
        FileWriteInteger(CommandFile, 1, CHAR_VALUE); // взводим флаг, что идет запись
        Sleep(100); // ждем на всякий случай
        FileSeek(CommandFile, 4, SEEK_SET);
        FileWriteInteger(CommandFile, (int)te, INT_VALUE);
        FileSeek(CommandFile, 0, SEEK_SET);
        FileWriteInteger(CommandFile, 0, CHAR_VALUE); // сбрасываем флаг
    }
}