PlaySound грузит процессор - страница 4

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

Формулирую правильно "по какому-то событию - один раз проиграть мелодию".

один раз на бар, как пример.....

 

Например, в 14:00 каждого дня один раз проиграть мелодию 

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

Например, в 14:00 каждого дня один раз проиграть мелодию 

MqlDateTime tm;
bool flag=true;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
 {

 TimeCurrent(tm);
  if(tm.hour==14) {
    if(flag) PlaySound("death magnetic.wav");
    flag=false;
  } else flag=true;

//--
 }
 
Vitaly Muzichenko:
зачем на каждом тике с 14-ти до 15-ти флагу присваивать false ? Лучше так)
MqlDateTime tm;
bool flag=true;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
 {

 TimeCurrent(tm);
  if(tm.hour==14) {
    if(flag) 
      {
      PlaySound("death magnetic.wav");
      flag=false;
      }
  } else flag=true;

//--
 }
... неблгодарный форумянин)


а еще лучше так. тогда  вообще в оператор if не будет заходить.

MqlDateTime tm;
bool flag=true;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
 {

 TimeCurrent(tm);
  if(tm.hour==14 && flag) {    
    PlaySound("death magnetic.wav");
    flag=false;      
  } else flag=true;

//--
 }

но есть один недостаток. на каждом тике, кроме нужного тика, будет заходить в else и присваивать флагу true.


я бы сделал так:

MqlDateTime tm;
bool flag=true;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
 {

 TimeCurrent(tm);
  if(tm.hour==14 && flag) 
   {
    PlaySound("death magnetic.wav");
    flag=false;      
   } 

  if(tm.hour==15) flag=true;

//--
 }
 

Есть вариант еще экономней

 
Dmitry Fedoseev:

Есть вариант еще экономней


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

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

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


Есть еще экономней

 
Dmitry Fedoseev:

Есть еще экономней

Есть, сейчас Я его напишу

 
int h=24; // час времени
int m=0; // минута времени

int t; // сек от начала дня до нужного времени
datetime nt=0; // время следующей игры

void OnInit(){
   
   t=h*3600+m*60;
   
   if(TimeCurrent()%86400>=t){ // сегодня уже поздно
      nt=(TimeCurrent()/86400+1)*86400+t; // будем завтра
   }
   else{
      nt=(TimeCurrent()/86400)*86400+t; // будем сегодня
   }
}

void OnStart(){
   
   if(TimeCurrent()>=nt){ // наступило время
      //... play
      nt=(TimeCurrent()/86400+1)*86400+t;
   }
   
}

Инициализация замороченная, а в процессе работы все сводится к одной проверке >=.

Только не проверял, может быть ошибся. Но главное идея.

 
Vitaly Muzichenko:

Есть, сейчас Я его напишу


а я уже

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