forked from rosh/MQL5Book
92 lines
3.7 KiB
MQL5
92 lines
3.7 KiB
MQL5
//+------------------------------------------------------------------+
| |
//| FileFlush.mq5 |
| |
//| Copyright 2021, MetaQuotes Ltd. |
| |
//| https://www.mql5.com |
| |
//+------------------------------------------------------------------+
| |
#property script_show_inputs
| |
| |
// NB: PRTF clears up _LastError, so don't use it in code blocks
| |
// using conditions based on _LastError
| |
#include "..\..\Include\PRTF.mqh"
| |
| |
input bool EnableFlashing = false;
| |
input bool UseCommonFolder = false;
| |
| |
const string dataport = "MQL5Book/dataport";
| |
const int flag = UseCommonFolder ? FILE_COMMON : 0;
| |
| |
//+------------------------------------------------------------------+
| |
//| Script program start function |
| |
//+------------------------------------------------------------------+
| |
void OnStart()
| |
{
| |
Print("\n*");
| |
// make initial setup
| |
bool modeWriter = true; // by default script starts to write data
| |
int count = 0; // number of writes/reads
| |
// create new file for writing or empty existing one for "sender" role
| |
int handle = PRTF(FileOpen(dataport,
| |
FILE_BIN | FILE_WRITE | FILE_SHARE_READ | flag));
| |
// if writing is impossible, another instance of the script is
| |
// already writing most likely, so try to read the same file
| |
if(handle == INVALID_HANDLE)
| |
{
| |
// check if the file can be read, if so then assuming "receiver" role
| |
handle = PRTF(FileOpen(dataport,
| |
FILE_BIN | FILE_READ | FILE_SHARE_WRITE | FILE_SHARE_READ | flag));
| |
if(handle == INVALID_HANDLE)
| |
{
| |
Print("Can't open file"); // this shouldn't be, something is wrong
| |
return;
| |
}
| |
modeWriter = false; // switch the mode
| |
}
| |
| |
// run main loop until user cancels it
| |
while(!IsStopped())
| |
{
| |
long temp = 0;
| |
if(modeWriter)
| |
{
| |
temp = TimeLocal(); // get current local datetime
| |
// append new timestamp every 5 seconds
| |
FileWriteLong(handle, temp);
| |
count++;
| |
if(EnableFlashing)
| |
{
| |
FileFlush(handle);
| |
}
| |
Print(StringFormat("Written[%d]: %I64d", count, temp));
| |
}
| |
else
| |
{
| |
ResetLastError();
| |
// read out all the file contents written by the sender
| |
// since we have read the file last time (approx. 5 seconds ago)
| |
// or from very beginning if this is first time we read the file;
| |
// NB: you may want to implement another logic, e.g.
| |
// skip pre-existed data and start reading new additions only
| |
while(true) // read until end of data, then break the loop
| |
{
| |
bool reportedEndBeforeRead = FileIsEnding(handle);
| |
ulong reportedTellBeforeRead = FileTell(handle);
| |
// metadata about file size remains the same
| |
// from the moment when the file was open for reading,
| |
// so do not call FileSeek(handle, 0, SEEK_END)
| |
// to keep reading past the End Of File (EOF)
| |
temp = FileReadLong(handle);
| |
// if there is no more data, we'll get error 5015 (ERR_FILE_READERROR)
| |
if(_LastError) break;
| |
// here we got data without error
| |
count++;
| |
Print(StringFormat("Read[%d]: %I64d\t"
| |
"(size=%I64d, before=%I64d(%s), after=%I64d)",
| |
count, temp,
| |
FileSize(handle), reportedTellBeforeRead,
| |
(string)reportedEndBeforeRead, FileTell(handle)));
| |
}
| |
}
| |
Sleep(5000);
| |
}
| |
}
| |
//+------------------------------------------------------------------+
|