Новая версия платформы MetaTrader 5 build 5100: Переход на Git и хаб разработчиков MQL5 Algo Forge, темная тема и улучшения интерфейса - страница 19

 
Forester #:
Возможно при EventKillTimer(); EventSetMillisecondTimer(100); EventSetTimer(100); надо что-то обнулить в внутреннем коде?

внутренний код как-бы помягче сказать :-)

не стоит EventKillTimer использовать внутри таймера, да и вообще - только в OnDeinit для порядка

void OnTimer() {

if (flagDownload()) Download();

}

void Download() {

....

if (allDone) flagDownload=false;

}

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

 
Vladislav Boyko #:

Редактор ошибочно думает, что mqproj файл изменен.

Для mq5 файлов тоже воспроизводится. Зря я не посмотрел тогда видео из этого поста (или оригинального) - мой пост можно было не писать.

[edit] @Vladimir Karputov, видео во вложениях выглядит странно (учитывая наличие кнопки), поэтому я "не рискнул" качать😁
 
Maxim Kuznetsov #:

внутренний код как-бы помягче сказать :-)

Внутренний код - имеется в виду код терминала, который видимо не обнуляет какую нибудь переменную, потому и пауза не правильная а суммированная. Видимо там +=X, а не =Х

Maxim Kuznetsov #:
у вас в процессе развития много чего на таймер завяжется и убивать его только вредить

Развивать нечего, уже требуемый функционал запрограммирован, даже кнопка останова вместо закрытия графика - скачивание работает, но оказалось, что вдвое дольше, за счет пауз равных времени скачивания.

 
Forester #:
Надеюсь к релизу разработчики успеют исправить.
Не надейтесь.
Просто Вы по-своему видите работу таймера, а разработчики терминала - по-своему. С их точки зрения следующее событие #Timer произойдёт после истечения заданного интервала времени от окончания обработки предыдущего события #Timer. И они правы по-своему.

Если Вас не устраивает такой подход - пишите свой диспетчер, который будет по событию #Timer отслеживать интервалы времени от начала предыдущей обработки и вызывать вашу функцию загрузки чего-то там.
 
Sergey Gridnev #:
Не надейтесь.
Просто Вы по-своему видите работу таймера, а разработчики терминала - по-своему. С их точки зрения следующее событие #Timer произойдёт после истечения заданного интервала времени от окончания обработки предыдущего события #Timer. И они правы по-своему.

Интервал то задан 100 мс и до EventKillTimer и после, а не 5100. Даже по вашему предположению это не правильно. Прошло на 5 секунд больше, или на 4, или на 6.... до 3 минут на реальных расчетах доходило.

 
Forester #:

Интервал то задан 100 мс и до EventKillTimer и после, а не 5100. Даже по вашему предположению это не правильно. Прошло на 5 секунд больше, или на 4, или на 6.... до 3 минут на реальных расчетах доходило.

Реализуете как надо Вам! Это несколько строк кода.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Бета-версия платформы MetaTrader 5 build 5050: Переход на Git и хаб разработчиков MQL5 Algo Forge, темная тема и улучшения интерфейса

Forester, 2025.06.04 08:20

input bool quick  = false;
void OnInit(){EventSetMillisecondTimer(100);}
void OnDeinit(const int reason){ EventKillTimer();}

ulong mcs;
void OnTimer()  {
   Print("OnTimer via ", (GetMicrosecondCount()-mcs)/1000," ms");
//   EventKillTimer();
   downloads();
}
int i=1;
void downloads(){
   if(quick){Print("start timer quick");}//быстрая функция
   else{//почему то тормозит перед запуском следущего OnTimer на время от предыдущго вызова
      mcs = GetMicrosecondCount();
      Sleep(i*1000); //медленные расчеты
      Print(i,") Work time: ", (GetMicrosecondCount()-mcs)/1000," ms");
      Print("start timer");
   }
   i++; if(i==10){Print("Finish!!!"); /*EventKillTimer()*/;return;}
   mcs = GetMicrosecondCount();
//   EventSetMillisecondTimer(100); 
}
2025.06.05 00:25:57.039 2) Work time: 2010 ms
2025.06.05 00:25:57.039 start timer
2025.06.05 00:25:57.146 OnTimer via 107 ms
2025.06.05 00:26:00.150 3) Work time: 3003 ms
2025.06.05 00:26:00.150 start timer
2025.06.05 00:26:00.257 OnTimer via 107 ms
2025.06.05 00:26:04.271 4) Work time: 4001 ms
2025.06.05 00:26:04.271 start timer
2025.06.05 00:26:04.379 OnTimer via 107 ms
2025.06.05 00:26:09.394 5) Work time: 5015 ms
2025.06.05 00:26:09.394 start timer
2025.06.05 00:26:09.501 OnTimer via 107 ms
2025.06.05 00:26:15.508 6) Work time: 6006 ms
2025.06.05 00:26:15.508 start timer
2025.06.05 00:26:15.616 OnTimer via 108 ms
2025.06.05 00:26:22.628 7) Work time: 7012 ms
2025.06.05 00:26:22.628 start timer
2025.06.05 00:26:22.735 OnTimer via 107 ms

Вместо таймера можно использовать EventChartCustom.

 
fxsaber #:

Вместо таймера можно использовать EventChartCustom.

Пробовал. В реальном советнике с работой кода до 3-х минут, через какое то время паузы становятся равными 0. И кнопки опять не нажимаются.
Воспроизвести на коротком коде не удалось.
 
Sergey Gridnev #:
Реализуете как надо Вам! Это несколько строк кода.

Мне надо чтобы при указании EventSetMillisecondTimer(100);, пауза была 100 мс. Но у меня нет доступа к коду терминала. Поэтому прошу разработчиков. Думаю у них это просто замена += на =.
 
Forester #:
Думаю у них это просто замена += на =.

У меня вопрос. Для потока, который тормознут Sleep(), события генерируются? Ответа у меня нет, но вот это выглядит так, как будто события перестают генерироваться для потока, который спит.