Особенности языка mql5, тонкости и приёмы работы - страница 269

 
Vladimir Simakov #:

Потому, что, результат будет таким:

Упорно дублируете вызовы EventChartCustom. Допилить защиту от дурака - вопрос энтузиазма лишь.

class EventLocker{
public:
   EventLocker( const ushort EventID = 0 ){
      EventLocker::m_lock = true;
      EventLocker::m_EventID = EventID;      
   }
   ~EventLocker(){
      EventLocker::m_lock = ::EventChartCustom(-1, EventLocker::m_EventID, 0, 0, NULL);
   }
   static void Unlock( const int &id ){EventLocker::m_lock = EventLocker::m_lock &&
                                                             (id != CHARTEVENT_CUSTOM + EventLocker::m_EventID);}
   static bool Locked() {return EventLocker::m_lock;}
private:
   static bool m_lock;
   static ushort m_EventID;
};

static bool EventLocker::m_lock = false;
static ushort EventLocker::m_EventID = 0;

double Calc()
  {
   double Res = 0;

   for(int i = 0; i < 1e8; i++)
      Res += MathSin(MathRand());
   return(Res);
  }
//+------------------------------------------------------------------+

void OnChartEvent(const int id, const long&, const double&, const string&)
  {
   if(id == CHARTEVENT_KEYDOWN && !EventLocker::Locked())
     {
      EventLocker lk(123);
      Print("Calculating...");
      Print(Calc());
     }
 
   EventLocker::Unlock(id);
  }

Как небольшой шажок.

 
fxsaber #:

Упорно дублируете вызовы EventChartCustom. Допилить защиту от дурака - вопрос энтузиазма лишь.

Как небольшой шажок.

Вот только есть два пути. Ты либо знаешь об этих траблах и обрабатываешь их, либо отхватываешь люлей в релизе.

 
fxsaber #:

Да. Когда ChartEventCustom возвращает false, то это нештатная ситуация. Помочь с ней может добавление Решения1.

class EventLocker{
public:
   ~EventLocker(){
      m_lock = true;
      m_hasSended = EventChartCustom(0, 0, 0, 0, "");
   }
   static void Unlock() {m_lock = false;}
   static bool Locked() {
      if (!m_hasSended)
         m_hasSended = EventChartCustom(0, 0, 0, 0, "");
      return m_lock;
   }
private:
   static bool m_lock;
   static bool m_hasSended;
};

bool EventLocker::m_lock = false;
bool EventLocker::m_hasSended = true;

double Calc()
  {
   double Res = 0;

   for(int i = 0; i < 1e8; i++)
      Res += MathSin(MathRand());
   return(Res);
  }
//+------------------------------------------------------------------+

void OnChartEvent(const int id, const long&, const double&, const string&)
{
   if(id == CHARTEVENT_KEYDOWN && !EventLocker::Locked())
     {
      EventLocker lk;
      Print("Calculating...");
      Print(Calc());
     }
   if(id == CHARTEVENT_CUSTOM)
      EventLocker::Unlock();
}

Как думаешь, поможет? 

 
fxsaber #:

Упорно дублируете вызовы EventChartCustom. Допилить защиту от дурака - вопрос энтузиазма лишь.

Как небольшой шажок.

Еще момент. Ты влияешь на статическое состояние объекта, параметром нестатических функций-членов, я про конструктор сейчас. Не очень разумное решение. Я бы сказал, что категорически вредное.

 
Vladimir Simakov #:

Как думаешь, поможет? 

Нет, конечно. Снова дублирование EventChartCustom.

 
Vladimir Simakov #:

Еще момент. Ты влияешь на статическое состояние объекта, параметром нестатических функций-членов, я про конструктор сейчас. Не очень разумное решение. Я бы сказал, что категорически вредное.

Это же не бибилиотека в КБ, а поделка, которую можно и нужно допиливать и обсуждать. Что и делаем.

Попробуйте создать подобную библиотеку в КБ, чтобы учитывала многие сценарии и была удобна в использовании.

У меня нет энтузиазма по этой теме, к сожалению.

 
fxsaber #:

Нет, конечно. Снова дублирование EventChartCustom.

Не к тому посту я писал.

Вот к этому

"Да. Когда ChartEventCustom возвращает false, то это нештатная ситуация. Помочь с ней может добавление Решения1."

 
Vladimir Simakov #:

Не к тому посту я писал.

Вот к этому

"Да. Когда ChartEventCustom возвращает false, то это нештатная ситуация. Помочь с ней может добавление Решения1."

Еще раз, дублирования этой функции быть не должно. Вызываться должна только в деструкторе и один раз по выходу из всех расчетов.

Решение1 - хорошая подмога на случай нештатной работы Решения2.

 

Кто-то смог запустить какую либо оптимизацию с применением Alglib?

Буду благодарен, если кто-то поделится ссылками на примеры использования.

 
fxsaber #:

И снова не следует дублировать эту функцию. Она должна вызываться только в деструкторе и один раз при выходе из всех вычислений.

Decision1 является хорошим помощником в случае нештатной работы Decision2.

Если я правильно понимаю, речь идет о многопоточной безопасности?

Если это так, то ни одно из предложенных решений не является безопасным.

Для безопасности потоков обязательна атомарная операция, только одна функция в MQL позволяет это сделать, и здесь она не использовалась.

На самом деле, чтобы сделать OnEvent многопоточным, необходима критическая секция. Такую секцию можно построить с помощью

GlobalVariableSetOnCondition.

Или я не на том пути?