forked from rosh/MQL5Book
94 lines
3.4 KiB
MQL5
94 lines
3.4 KiB
MQL5
//+------------------------------------------------------------------+
| |
//| FileHolder.mq5 |
| |
//| Copyright 2021, MetaQuotes Ltd. |
| |
//| https://www.mql5.com |
| |
//+------------------------------------------------------------------+
| |
#define FILE_DEBUG_PRINT
| |
| |
#include "..\..\Include\MqlError.mqh"
| |
#include "..\..\Include\FileHolder.mqh"
| |
#include "..\..\Include\PRTF.mqh"
| |
| |
// NB: we will open the same file many times in this script
| |
// just for demonstration purpose;
| |
// normally you need only one handle for a file in a program
| |
| |
const string dummy = "MQL5Book/dummy";
| |
| |
//+------------------------------------------------------------------+
| |
//| Subfunction where more file handles are opened in local context |
| |
//+------------------------------------------------------------------+
| |
void SubFunc()
| |
{
| |
Print(__FUNCTION__, " enter");
| |
FileHolder holder;
| |
int h = PRTF(holder.FileOpen(dummy, FILE_BIN | FILE_WRITE | FILE_SHARE_WRITE | FILE_SHARE_READ));
| |
int f = PRTF(holder.FileOpen(dummy, FILE_BIN | FILE_WRITE | FILE_SHARE_WRITE | FILE_SHARE_READ));
| |
// use h and f somehow,
| |
// ...
| |
// Print(FileHolder::GetFilename(f));
| |
// no need to close files manually and track early returns
| |
Print(__FUNCTION__, " exit");
| |
}
| |
| |
//+------------------------------------------------------------------+
| |
//| Script program start function |
| |
//+------------------------------------------------------------------+
| |
void OnStart()
| |
{
| |
Print(__FUNCTION__, " enter");
| |
| |
FileHolder holder;
| |
int h = PRTF(holder.FileOpen(dummy, FILE_BIN | FILE_WRITE | FILE_SHARE_WRITE | FILE_SHARE_READ));
| |
// some data writing and other action on 'h' could be here
| |
// ...
| |
/*
| |
int a[] = {1, 2, 3};
| |
FileWriteArray(h, a);
| |
*/
| |
| |
SubFunc();
| |
SubFunc();
| |
| |
if(rand() > 32000) // imitate branches on possible conditions
| |
{
| |
// we do not need this with the holder
| |
// FileClose(h);
| |
Print(__FUNCTION__, " return");
| |
return; // we can have multiple exits from a function
| |
}
| |
| |
/*
| |
... more code
| |
*/
| |
| |
// we do not need this with the holder
| |
// FileClose(h);
| |
| |
Print(__FUNCTION__, " exit");
| |
| |
// Note: we do not close any file handles manually
| |
// FileHolder instances will do it automatically in appropriate destructors
| |
| |
/*
| |
output:
| |
| |
OnStart enter
| |
holder.FileOpen(dummy,FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ)=1 / ok
| |
SubFunc enter
| |
holder.FileOpen(dummy,FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ)=2 / ok
| |
holder.FileOpen(dummy,FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ)=3 / ok
| |
SubFunc exit
| |
FileOpener::~FileOpener: Automatic close for handle: 3
| |
FileOpener::~FileOpener: Automatic close for handle: 2
| |
SubFunc enter
| |
holder.FileOpen(dummy,FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ)=2 / ok
| |
holder.FileOpen(dummy,FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ)=3 / ok
| |
SubFunc exit
| |
FileOpener::~FileOpener: Automatic close for handle: 3
| |
FileOpener::~FileOpener: Automatic close for handle: 2
| |
OnStart exit
| |
FileOpener::~FileOpener: Automatic close for handle: 1
| |
*/
| |
}
| |
//+------------------------------------------------------------------+
|