2015-01-19 4 views
0

В приложении с командной строкой, которое я создаю, я хотел бы иметь одновременно два «процесса». Под процессами я имею в виду:C++ Выполнение двух «процессов» в одно и то же время

Каждые 57 секунд я хотел бы выполнить задачу A и каждые 250 секунд выполнить задачу B. Это произвольно выбранные числа, но вы получаете точку.

Как я могу проверить оба этих процесса одновременно?

Спасибо ребята

+2

Что мешает вам использовать потолки и спит? –

+0

Что такое нить? Что касается сна, если я должен был сделать 57000 сна, а затем спать 250000, то задача 57 секунд будет пропущена. –

+0

В какой операционной системе вы используете – Simon

ответ

2

Вы могли бы сделать что-то вроде этого, если ни один из процесса занимает много времени.

float Atime = 57.f; 
float Btime = 250.f; 
float startTime = someTimerFunc(); 
while(true) { 
    sleep(a few milliseconds); 


    float endTime = someTimerFunc(); 
    float deltaTime = endTime - startTime; 
    startTime = endTime; 



    Atime -= deltaTime; 
    Btime -= deltaTime; 
    if(Atime < 0) { 
     Atime += 57.f; 
     AProcess(); 
    } 
    if(Btime < 0) { 
     Btime += 250.f; 
     BProcess(); 
    } 
} 

Или вы можете посмотреть, что такое потоки.

+0

Интересно. Большое спасибо! Я попробую это. –

+0

@JoshBeckwith Я надеюсь, что это поможет. Это может не сработать, я не тестировал его, но вы можете попробовать. – BWG

2

Выполнение 2 потоков было бы хорошим способом справиться с этим, если у вас нет причин для различных процессов. Что-то вроде этого:

void taskA() { /*...*/ } 
void taskB() { /*...*/ } 

/*...*/ 

bool exit = false; 
std::mutex mutex; 
std::condition_variable cv; 

auto runLoop = [&](auto duration, auto task) 
    { 
     std::unique_lock<std::mutex> lock{mutex}; 

     while(true) 
     { 
      if(!cv.wait_for(lock, duration, [&]{ return !exit; })) 
       task(); 
      else 
       return; 
     } 
    }; 

std::thread a{ [&]{ runLoop(std::chrono::seconds{57}, taskA); }}; 
std::thread b{ [&]{ runLoop(std::chrono::seconds{250}, taskB); }}; 

Выполнение этого способа - это стандартная платформа C++, которая является основным преимуществом. Он использует C++ 11: lambdas и библиотеку потоков.

+0

http://stackoverflow.com/questions/7709894/using-auto-in-a-lambda-function – amdn

+0

@amdn ya ... C++ 14 только. – David

1

Как сказано выше, вы можете использовать потоки вместо процессов. Если вы используете C++ 11, посмотрите here о том, как вы можете создать поток.

В примере ссылки просто замените foo и bar кодом, которым вы хотите выполнить задачу A и задачу B.

Также вы можете посмотреть here, как вы можете заставить свою программу ждать некоторое время с сон.

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