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

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

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

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

 
Ihor Herasko:

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


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

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

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

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

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

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

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

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

 
Ihor Herasko:

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

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

bool flag=true;

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

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

 
Ihor Herasko:

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

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

 
Сергей Матвеев:

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

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

bool flag=true;

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


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

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