2013-03-02 60 views
0

我正在用C++編寫一些東西,其中包括一個倒計時函數,它在達到0時設置一個值。我一直在研究線程/ pthreads/boost線程幾個小時,我似乎無法得到任何工作,所以我理想的是尋找需要用我的代碼做什麼的演練。我對C++相當陌生,但不管語言如何,併發性都超出了我以前看過的任何內容。在後臺運行函數直到完成MinGW + Windows

我想在後臺運行的功能是:

void Counter::decrementTime(int seconds){ 
    while(seconds != 0){ 
     seconds--; 
     Sleep(1000); 
    } 
    bool = false; 
} 

它將通過爲簡單的東西可以被稱爲(這只是舉例):

void Counter::setStatus(string status){ 
    if(status == "true"){ 
     bool = true; 
     decrementTime(time); // Needs to run in background. 
    } else if (status != "false"){ 
     bool = false; 
    } 
} 

我已經嘗試了各種各樣的東西,如std:thread myThread(decrementTime, time);以及其他各種嘗試(所有標題正確包括等)。

如果有人能幫助我,我會很感激。我不需要監視正在運行的函數或任何其他的東西,我需要的就是在它到達時設置bool。我使用啓用了-std=c++11的MinGW編譯器運行Windows,正如我前面提到的,我很樂意解決這個問題(並解釋了它是如何解決的),所以我可以更好地理解這個概念!

哦,如果有沒有線程的替代(更好)的方式來做到這一點,請隨時分享您的知識!

+0

請詳細說明你準備嘗試完成的事情,請在「if(status ==」true「)... else if(status!=」false「)等條件下解釋你的邏輯......」 – 2013-03-02 00:39:27

+0

@AndyT那不是它會是什麼,這僅僅是爲了舉例。我想繼續做不同的事情,而'seconds'在後臺倒數到0。意思是我可以在別處使用'while(!bool)'。 – whitfin 2013-03-02 00:45:39

回答

1

你可以使用一個std::atomic_bool爲標誌,並std::async推出時間在一個單獨的線程:

#include <atomic> 
#include <chrono> 
#include <future> 

std::atomic_bool flag{true}; 

void countDown(int seconds){ 
    while(seconds > 0){ 
    seconds--; 
    std::this_thread::sleep_for(std::chrono::miliseconds(??)); // 
    } 
    flag = false; 
} 

auto f = std::async(std::launch::async, std::bind(countDown, time)); 

// do your work here, checking on flag 
while (!flag) { ... } 

f.wait(); // join async thread 
+0

有什麼我必須做的才能使async可用?這些標題似乎不適合我。 – whitfin 2013-03-02 15:44:13

+0

@ Zackehh9lives它應該在''標題中。這可能是因爲你沒有所需的C++ 11。您也可以在'std :: thread'中啓動並在末尾調用'thread.join()'。 – juanchopanza 2013-03-03 08:45:23

+1

即使我使用C++ 11,這也是MinGW中的一個問題,但我已經對它進行了修補,現在它正在工作,謝謝! – whitfin 2013-03-03 13:01:37

1

您可以使用std ::異步和std::future及其方法「wait_for」 0超時

+0

我將如何運行'decrementTime()'使用異步? – whitfin 2013-03-02 00:57:08

+0

std :: async(std :: launch :: async,std :: bind(decreentTime,time))。但是想法是,yu不需要任何共享的bool變量,您可以使用返回的std :: future並查詢它是否已完成 – 2013-03-02 03:45:42

相關問題