2013-09-02 6 views
0

У меня есть приложение, мне нужно спать новый поток, не останавливая выполнение текущего.C++ thread sleep без замораживания текущей темы

Часть кода из приложения:

PlaySound(L"sounds\\started.wav", NULL, SND_FILENAME); 
thread photos(makeScreens); 
photos.join(); 
CONSOLE_Print("Some testing string"); 

И функция, которая должна работать асинхронно:

void makeScreens(){ 
    CONSOLE_Print("Make Screens entered"); 
    srand (time(NULL)); 
    CONSOLE_Print("Sleeping 30s"); 
    Sleep(30000); 
    CONSOLE_Print("Wake up"); 
    long int delay; 
    for(int i=0; i<5; i++){ //loop for max screens=5 
     delay=rand() % 600000 + 60000; //random a delay beetween sreens from 1 to 10 minutes 
     CONSOLE_Print("Sleeping "+delay/1000); 
     Sleep(delay); //sleep 
     CONSOLE_Print("Wake up and make screen"); 
     gdiscreen(i); //take a screen 
    } 
} 

Так что я хочу, чтобы запустить makescreens() без остановки текущего выполнения приложения. Мой выпуск должен быть таким:

Some testing string 
Make Screens entered 
Sleeping 30s 
Wake up 
Sleeping xxxx 
Wake up and make screen 

Как это исправить? Есть ли другой способ вместо сна? Я nawbie в C++.

+0

Вопрос о 'Sleep' заключается в том, чтобы заморозить текущую нить, поэтому ваш вопрос не имеет особого смысла. –

ответ

0

Не звоните photos.join();.

Это приведет к тому, что ваш основной поток будет ждать окончания фотоконтента.

+0

Итак, как назвать это, не дожидаясь, пока это не закончится? – lisek

+0

попробуйте photos.detach(); Но вы должны убедиться, что основной поток работает до тех пор, пока ваша фотоверсия не закончится, иначе она будет убита до того, как она будет завершена. –

+0

Это работает, спасибо большое! – lisek

0

соединение означает, что основная нить (которая запустила новую нить) ждет начала резьбы до конца. Таким образом, порядок ниже должен соответствовать требованиям к заказу на печать.

PlaySound(L"sounds\\started.wav", NULL, SND_FILENAME); 
CONSOLE_Print("Some testing string"); 
thread photos(makeScreens); 
photos.join(); 
CONSOLE_Print("new thread has now finished running");