Как сделать отжатие кнопки через 1 секунду

 

Добрый день, собственно тема и есть вопрос. Нужно чтобы при нажатии на кнопку произошло действие и кнопка выключилась не сразу а через секунду/две

         if(ObjectGetInteger(0,"check",OBJPROP_STATE,true))
           {  
            ....
            ObjectSetInteger(0,"check",OBJPROP_STATE,false);
           }
         else
           {
            ObjectSetInteger(0,"check",OBJPROP_STATE,false);
           }
 
vebster005:

Добрый день, собственно тема и есть вопрос. Нужно чтобы при нажатии на кнопку произошло действие и кнопка выключилась не сразу а через секунду/две

Sleep(2000);

Нет?

 
vebster005:

Добрый день, собственно тема и есть вопрос. Нужно чтобы при нажатии на кнопку произошло действие и кнопка выключилась не сразу а через секунду/две

нет. лучше так.

static datetime time = TimeCurrent();

if(ObjectGetInteger(0, "check", OBJPROP_STATE, true))
  {
   if(time + 2 = TimeCurrent())
      ObjectSetInteger(0, "check", OBJPROP_STATE, false);
  }
 
Наверное, для этого лучше использовать событие OnTimer().
 
Ihor Herasko:
Наверное, для этого лучше использовать событие OnTimer().
         if(ObjectGetInteger(0,"check",OBJPROP_STATE,true))
           {  
            ....
    	    Sleep(10000);
            ObjectSetInteger(0,"check",OBJPROP_STATE,false);
           }
         else
           {
            ObjectSetInteger(0,"check",OBJPROP_STATE,false);
           }

Не могу понять почему в индикаторе не работает? Может ли быть 2 слипа и более в разных местах кода, могут ли они работать параллельно?

 
Aleksandr Slavskii:

нет. лучше так.

ошибка:
   if(time + 2 = TimeCurrent())  ругается на + и на =

 
vebster005:

Не могу понять почему в индикаторе не работает? Может ли быть 2 слипа и более в разных местах кода, могут ли они работать параллельно?

Вы не написали, что это индикатор. 

Sleep

Функцию Sleep() нельзя вызывать из пользовательских индикаторов

 
vebster005:

ошибка:
   if(time + 2 = TimeCurrent())  ругается на + и на =

Опечатался, конечно надо ==

 
Aleksandr Slavskii:

Опечатался, конечно надо ==

Спасибо но не работает:

static datetime time = TimeCurrent();

if(ObjectGetInteger(0, "check", OBJPROP_STATE, true))
  {
    ...
   if(time + 2  == TimeCurrent())
      ObjectSetInteger(0, "check", OBJPROP_STATE, false);
  }

т.е кнопка нажимается, но она не отжимается почему то? могли бы ответить почему?

 
vebster005:

Спасибо но не работает:

т.е кнопка нажимается, но она не отжимается почему то? могли бы ответить почему?

Код нужно видоизменить и к тому-же использовать TimeLocal();

TimeCurrent() меняет значение только на тике, а его может не быть более минуты

 
#property indicator_chart_window
#property indicator_plots 0

#include <Controls\Button.mqh>

//+------------------------------------------------------------------+
class CPauseButton: public CButton
{
private:
   const uint        _pause;
   datetime          _sec;
public:
                     CPauseButton(const string txt, const uint pause, const long chart, const string name, const int subwin,
                const int x1, const int y1, const int x2, const int y2) : _pause(pause), _sec(0)
   {
      Create(chart, name, subwin, x1, y1, x2, y2);
      Text(txt);
   }
                    ~CPauseButton() { Destroy(); }
   void              CheckPause();
};
//+------------------------------------------------------------------+
void CPauseButton::CheckPause(void)
{
   if(_sec > 0)
   {
      if(TimeLocal() < _sec) return;
      _sec = 0;
      Pressed(false);
      printf(" Button %s unlocked", Name());
   }

   if(Pressed())
   {
      _sec = TimeLocal() + _pause;
      printf(" Button %s LOCK", Name());
      return;
   }
}
//+------------------------------------------------------------------+

CPauseButton Button("MyButton", 3, 0, "button", 0, 10, 50, 110, 100);

int OnInit()
{
   EventSetMillisecondTimer(100);
   return(INIT_SUCCEEDED);
}

void  OnDeinit(const int reason)
{
   EventKillTimer();
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
//---

//--- return value of prev_calculated for next call
   return(rates_total);
}
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
{
   Button.CheckPause();
}
//+------------------------------------------------------------------+


такой код должен работать, но нужно бы блокировку кнопки сделать или цвет поменять, но в логе правильно пишет состояние

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