Как проиграть 5-минутную мелодию в советнике?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Сергей Матвеев
1358
Сергей Матвеев  
Как проиграть 5-минутную мелодию полностью?

Чтобы на каждом новом тике она не прерывалась и не начиналась заново?
Ihor Herasko
21882
Ihor Herasko  

Проигрывание звука не мешает выполнению кода, т. к. функция PlaySound является асинхронной. Таким образом, никакой проблемы нет.

Сергей Матвеев
1358
Сергей Матвеев  
Ihor Herasko:

Проигрывание звука не мешает выполнению кода, т. к. функция PlaySound является асинхронной. Таким образом, никакой проблемы нет.


Так как мне проиграть 5-минутную мелодию полностью?

а то только что посмотрел, на каждом тике прерывается проигрывание мелодии и начинается заново.
Ihor Herasko
21882
Ihor Herasko  
Сергей Матвеев:

Так как мне проиграть 5-минутную мелодию полностью?

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

Значит, алгоритм неправильно составлен. Наверное, в OnTick() при достижении времени Вы просто запускаете проигрывание? Конечно же, на каждом тике будет проигрываться заново.

При первом PlaySound нужно установить флаг начала проигрывания и проверять его в момент следующего входа в OnTick(). Если флаг установлен, то не запускать проигрывание заново.

P. S. При этом нужно следить, чтобы в терминале не запустился какой-либо другой звук, потому что он как раз и прервет проигрывание текущего звука.

P. P. S. Вообще очень странно использовать терминал в качестве будильника. Для этого лучше применить сторонний софт, там и проблем никаких не будет.

Сергей Матвеев
1358
Сергей Матвеев  
Ihor Herasko:

При первом PlaySound нужно установить флаг начала проигрывания и проверять его в момент следующего входа в OnTick(). Если флаг установлен, то не запускать проигрывание заново.

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

bool flag=true;

void OnTick()
  {  
  if (Minute()>=0 && flag==true) PlaySound("Dan");
  flag=false;
  }

спасибо за совет.

Сергей Матвеев
1358
Сергей Матвеев  
Ihor Herasko:

P. P. S. Вообще очень странно использовать терминал в качестве будильника. Для этого лучше применить сторонний софт, там и проблем никаких не будет.

в mql-программиста должен быть и будильник в терминале и плеер)

Ihor Herasko
21882
Ihor Herasko  
Сергей Матвеев:

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

Немного не так. Потому как флаг будет сброшен, даже если нужное время не наступило. Именно для этого кода правильнее так:

bool flag=true;

void OnTick()
  {  
  if (Minute()>=0 && flag)
     {
     PlaySound("Dan");
     flag=false;
     }
  }
Ihor Herasko
21882
Ihor Herasko  
Сергей Матвеев:
в mql-программиста должен быть и будильник в терминале и плеер)


Просто будете бороться со сторонними звуками, которых может быть много в терминале. За 5 минут такое событие вполне может произойти.

Но даже для этого случая есть решение - запустить PlaySound в отдельном потоке. Но это уже при помощи WinAPI. За то в терминале )))

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий