Нужны ли глобальные переменные терминала типа string? - страница 2

 
George Merts:

fxsaber, хм... Век живи, век учись - можно темплейты вот прямо так использовать, без угловых скобок ?

Я всегда использовал только так:

Print(_GlobalVariableGet<MqlTick>(Name).time);

_GlobalVariableGet, конечно, можно использовать и в bool-варианте (как у штатной). Например, то же самое (уже без угловых скобок)
MqlTick Tick;

if (_GlobalVariableGet(Name, Tick))
  Print(Tick.time);
 
fxsaber:

Как вариант, таким образом можно записывать и считывать из глобальных переменных строки, простые структуры и даже массивы (например, обмениваться результатами CopyTicks)

Возможно, стоит причесать в виде библиотеки.

атомарность нарушается и можно наступить на крепкие грабли
 
Maxim Kuznetsov:
атомарность нарушается и можно наступить на крепкие грабли
Не владею терминологией. Поясните.
 
fxsaber:
Не владею терминологией. Поясните.

к примеру в внутри цикла

for (int i = 0; i < Size; i++)                                                    \
      GlobalVariableSet(GetName(Name, i), Array[i]);    

есть шанс что массив (структура) будет одновременно изменяться от другой стороны (советника) и вы часть массива получите прежним, а оставшуюся новым. То есть в результате будет тыква.

 
Maxim Kuznetsov:

к примеру в внутри цикла

есть шанс что массив (структура) будет одновременно изменяться от другой стороны (советника) и вы часть массива получите прежним, а оставшуюся новым. То есть в результате будет тыква.

Для этого есть GlobalVariableSetOnCondition, а альтернативу ей было влом писать.

Честно говоря, никогда не использовал глобальные переменные. Поэтому даже не знаю, для чего они нужны.

 
Maxim Kuznetsov:

к примеру в внутри цикла

есть шанс что массив (структура) будет одновременно изменяться от другой стороны (советника) и вы часть массива получите прежним, а оставшуюся новым. То есть в результате будет тыква.

fxsaber:
Не владею терминологией. Поясните.
самый технически правильный способ - это к вашей библиотеки TypeToBytes (так кажется называется) привесить опциональный интерфейс к любой key-value базе. Да, это будет DLL, но зато это будет круто.
 
Maxim Kuznetsov:
самый технически правильный способ - это к вашей библиотеки TypeToBytes (так кажется называется) привесить опциональный интерфейс к любой key-value базе. Да, это будет DLL, но зато это будет круто.

Тут терминологическое невежество снова не позволяет мне понять смысл сказанного.

Крутость не преследуется. Библиотеку используют < 1%. Еще бОльшие навороты будут использовать < 1% от этих использующих. Поэтому видится правильным, что должна быть просто база. И она есть. Уже этого оказалось достаточным, чтобы легко писать ранее сложные вещи. Код выше - из таких вещей.

 
fxsaber:

Тут терминологическое невежество снова не позволяет мне понять смысл сказанного.

Крутость не преследуется. Библиотеку используют < 1%. Еще бОльшие навороты будут использовать < 1% от этих использующих. Поэтому видится правильным, что должна быть просто база. И она есть. Уже этого оказалось достаточным, чтобы легко писать ранее сложные вещи. Код выше - из таких вещей.

key-value база - минималистичная СУБД которая хранит произвольные данные по произвольным-же уникальным ключам и гарантирует атомарность чтения-записи.

Просто постановка вопроса - "а может стоит хранить строки?" намекает что стоит хранить вообще произвольные данные. Да и вместо ключей удобно использовать структуры. А это и  есть key-value база. А ваша библиотека как раз и работает с произвольными данными (по крайней мере их конвертирует). То есть возможность внешнего хранения данных - логичное развитие.

PS/ ещё раз - код который выше несёт в себе ошибку. А то сейчас не подумавши начнут тягать к себе в проекты :-)
 
Maxim Kuznetsov:

PS/ ещё раз - код который выше несёт в себе ошибку. А то сейчас не подумавши начнут тягать к себе в проекты :-)

В чем ошибка _GlobalVariableSet, по сравнению со штатной GlobalVariableSet? Обе не обладают атомарным доступом.


Прошу показать в кодобазе библиотеку, обладающую атомарным доступом. Или в том же MQL, акромя упомянутой GlobalVariableSetOnCondition.


File-функции - нет, включая Memory Mapping. Где такой функционал?

 
fxsaber:

В чем ошибка _GlobalVariableSet, по сравнению со штатной GlobalVariableSet? Обе не обладают атомарным доступом.


Прошу показать в кодобазе библиотеку, обладающую атомарным доступом. Или в том же MQL, акромя упомянутой GlobalVariableSetOnCondition.


File-функции - нет, включая Memory Mapping. Где такой функционал?

Как раз все стандартные GlobalVariableXXX атомарны. GlobalVariableGet гарантирует что ты получишь значение записанное GlobalVariableSet целиком в том виде в каком оно в последний раз записано.

А вот если использовать вашу _GlobalVariableGet то получается ай-яай :-) В двух потоках (советниках) запустился _GlobalVariableSet, а в третьем одновременно _GlobalVariableGet получит мусор, часть данных от одного, часть от другого. Затейливая такая ошибка, сложно имитируется в тестировании, но в реальной жизни проявится в самый неподходящий момент.



Причина обращения: