2013-12-12 2 views
0

Я пытаюсь выполнить функцию таймера, которая обновляется каждые 1 секунду для специальных событий. Проблема в том, что если я использовал while + Sleep(1000) или for loop + Sleep(1000), он не загружает другие функции под ним, поэтому я ищу решение.Функция таймера C++, обновляется каждые 1 секунду

Я попытался следующие:

void Timer(){ 
    while(true){ 
    // events 
    if(Get_Current_Minute == Event_Minute) 
     // do event 
     Sleep(1000); 
    } 
} 

int Main(){ 

    std::cout << " Hello " << std::endl; // loaded 
    Function() // loaded; 

    Timer(); // the timer function 

    std::cout << " Other functions " << std::endl; // not loaded 
    Function_2() // not loaded 
} 

Так что может быть решение? Я хочу загрузить все в моем приложении +, каждый раз обновляйте таймер для событий.

+1

Многопоточность. – David

+0

Я полагаю, вам нужно прочитать о многопоточности, так как ваша текущая программа однопоточная –

+1

Где именно соединение с javascript? – Till

ответ

1

вы выполняете функцию таймера()

  • который является бесконечный цикл
  • поэтому он никогда не будет по-прежнему ваш Function_2();

если вы хотите реализовать это как есть, то таймер(); должны быть

  • отдельный поток
  • или реальное событие OS Timer (без сна или цикла)

Если вы не можете/не хотят идти по этому пути

  • , то вы должны объединить Function_2() и Timer() вместе.
  • В этом случае не следует использовать Sleep
  • но измерения в реальном масштабе времени, и если оно больше, то время запланировано событие
  • выполнить его и план следующего события времени

пример резьбы:

//--------------------------------------------------------------------------- 
volatile int threads_run=0; 
volatile bool threads_stop=false; 
unsigned long __stdcall thread_timer(LPVOID p) 
    { 
    threads_run++; 
    for (;threads_stop;) 
     { 
     //Do your event stuff 
     Sleep(1000); 
     } 
    threads_run--; 
    return 0; 
    } 
void main() 
    { 
    HANDLE hnd; 
    std::cout << " Hello " << std::endl; 
    Function(); 

    // start Timer thread 
    hnd=CreateThread(0,0,thread_timer,NULL,0,0); 

    std::cout << " Other functions " << std::endl; 
    Function_2(); 

    // stop and wait for all threads 
    threads_stop=true; 
    for (;threads_run;) Sleep(10); 
    } 
//--------------------------------------------------------------------------- 
+0

ну, не забудьте закрытьHandle (hnd), когда вам это больше не понадобится (закрыть дескриптор не будет прекращать поток), когда ваше приложение остановит его, оно автоматически закрывает его, но если вы динамически создаете много потоков, тогда вы закрываете свои ручки сами в противном случае вы будете потреблять все больше и больше ручек до тех пор, пока Windows не перестанет работать вообще (а не только ваше приложение). PS-дескрипторы могут использоваться для изменения аффинности или приостановки/возобновления/завершения потоков – Spektre

Смежные вопросы