Внутренний код - имеется в виду код терминала, который видимо не обнуляет какую нибудь переменную, потому и пауза не правильная а суммированная. Видимо там +=X, а не =Х
Maxim Kuznetsov #: у вас в процессе развития много чего на таймер завяжется и убивать его только вредить
Развивать нечего, уже требуемый функционал запрограммирован, даже кнопка останова вместо закрытия графика - скачивание работает, но оказалось, что вдвое дольше, за счет пауз равных времени скачивания.
Forester #: Надеюсь к релизу разработчики успеют исправить.
Не надейтесь.
Просто Вы по-своему видите работу таймера, а разработчики терминала - по-своему. С их точки зрения следующее событие #Timer произойдёт после истечения заданного интервала времени от окончания обработки предыдущего события #Timer. И они правы по-своему.
Если Вас не устраивает такой подход - пишите свой диспетчер, который будет по событию #Timer отслеживать интервалы времени от начала предыдущей обработки и вызывать вашу функцию загрузки чего-то там.
Просто Вы по-своему видите работу таймера, а разработчики терминала - по-своему. С их точки зрения следующее событие #Timer произойдёт после истечения заданного интервала времени от окончания обработки предыдущего события #Timer. И они правы по-своему.
Интервал то задан 100 мс и до EventKillTimer и после, а не 5100. Даже по вашему предположению это не правильно. Прошло на 5 секунд больше, или на 4, или на 6.... до 3 минут на реальных расчетах доходило.
Интервал то задан 100 мс и до EventKillTimer и после, а не 5100. Даже по вашему предположению это не правильно. Прошло на 5 секунд больше, или на 4, или на 6.... до 3 минут на реальных расчетах доходило.
Реализуете как надо Вам! Это несколько строк кода.
inputbool quick = false;
voidOnInit(){EventSetMillisecondTimer(100);}
voidOnDeinit(constint reason){ EventKillTimer();}
ulong mcs;
voidOnTimer() {
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.0500:25:57.0392) Work time: 2010 ms
2025.06.0500:25:57.039 start timer
2025.06.0500:25:57.146 OnTimer via 107 ms
2025.06.0500:26:00.1503) Work time: 3003 ms
2025.06.0500:26:00.150 start timer
2025.06.0500:26:00.257 OnTimer via 107 ms
2025.06.0500:26:04.2714) Work time: 4001 ms
2025.06.0500:26:04.271 start timer
2025.06.0500:26:04.379 OnTimer via 107 ms
2025.06.0500:26:09.3945) Work time: 5015 ms
2025.06.0500:26:09.394 start timer
2025.06.0500:26:09.501 OnTimer via 107 ms
2025.06.0500:26:15.5086) Work time: 6006 ms
2025.06.0500:26:15.508 start timer
2025.06.0500:26:15.616 OnTimer via 108 ms
2025.06.0500:26:22.6287) Work time: 7012 ms
2025.06.0500:26:22.628 start timer
2025.06.0500:26:22.735 OnTimer via 107 ms
Вместо таймера можно использовать EventChartCustom.
Вместо таймера можно использовать EventChartCustom.
Пробовал. В реальном советнике с работой кода до 3-х минут, через какое то время паузы становятся равными 0. И кнопки опять не нажимаются. Воспроизвести на коротком коде не удалось.
Sergey Gridnev #: Реализуете как надо Вам! Это несколько строк кода.
Мне надо чтобы при указании EventSetMillisecondTimer(100);, пауза была 100 мс. Но у меня нет доступа к коду терминала. Поэтому прошу разработчиков. Думаю у них это просто замена += на =.
Forester #: Думаю у них это просто замена += на =.
У меня вопрос. Для потока, который тормознут Sleep(), события генерируются? Ответа у меня нет, но вот это выглядит так, как будто события перестают генерироваться для потока, который спит.
Возможно при EventKillTimer(); EventSetMillisecondTimer(100); EventSetTimer(100); надо что-то обнулить в внутреннем коде?
внутренний код как-бы помягче сказать :-)
не стоит EventKillTimer использовать внутри таймера, да и вообще - только в OnDeinit для порядка
void OnTimer() {
if (flagDownload()) Download();
}
void Download() {
....
if (allDone) flagDownload=false;
}
у вас в процессе развития много чего на таймер завяжется и убивать его только вредить
Редактор ошибочно думает, что mqproj файл изменен.
Для mq5 файлов тоже воспроизводится. Зря я не посмотрел тогда видео из этого поста (или оригинального) - мой пост можно было не писать.
[edit] @Vladimir Karputov, видео во вложениях выглядит странно (учитывая наличие кнопки), поэтому я "не рискнул" качать😁внутренний код как-бы помягче сказать :-)
Внутренний код - имеется в виду код терминала, который видимо не обнуляет какую нибудь переменную, потому и пауза не правильная а суммированная. Видимо там +=X, а не =Х
у вас в процессе развития много чего на таймер завяжется и убивать его только вредить
Развивать нечего, уже требуемый функционал запрограммирован, даже кнопка останова вместо закрытия графика - скачивание работает, но оказалось, что вдвое дольше, за счет пауз равных времени скачивания.
Надеюсь к релизу разработчики успеют исправить.
Не надейтесь.
Интервал то задан 100 мс и до EventKillTimer и после, а не 5100. Даже по вашему предположению это не правильно. Прошло на 5 секунд больше, или на 4, или на 6.... до 3 минут на реальных расчетах доходило.
Интервал то задан 100 мс и до EventKillTimer и после, а не 5100. Даже по вашему предположению это не правильно. Прошло на 5 секунд больше, или на 4, или на 6.... до 3 минут на реальных расчетах доходило.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Бета-версия платформы MetaTrader 5 build 5050: Переход на Git и хаб разработчиков MQL5 Algo Forge, темная тема и улучшения интерфейса
Forester, 2025.06.04 08:20
Вместо таймера можно использовать EventChartCustom.
Вместо таймера можно использовать EventChartCustom.
Воспроизвести на коротком коде не удалось.
Реализуете как надо Вам! Это несколько строк кода.
Думаю у них это просто замена += на =.
У меня вопрос. Для потока, который тормознут Sleep(), события генерируются? Ответа у меня нет, но вот это выглядит так, как будто события перестают генерироваться для потока, который спит.