2015-06-17 49 views
0

我使用的是Microsoft Visual Studio Express。C++有一個函數在後臺重複使用

我已經看到this問題的接受答案,它似乎沒有做我想做的事情。

這是重複每一秒對我來說功能:

double time_counter = 0; 
clock_t this_time = clock(); 
clock_t last_time = this_time; 
const int NUM_SECONDS = 1; 
void repeat() 
{ 
    while (1) 
    { 
     this_time = clock(); 

     time_counter += (double)(this_time - last_time); 

     last_time = this_time; 

     if (time_counter > (double)(NUM_SECONDS * CLOCKS_PER_SEC)) 
     { 
      time_counter -= (double)(NUM_SECONDS * CLOCKS_PER_SEC); 
      rockSecPast++; 
     } 
    } 
} 

我試圖做到的是重複這一點的同時在後臺運行。我的意思是我希望這個函數能夠運行,但是程序仍然繼續執行其他函數,並且通常在後臺重複使用此函數時正常運行。

我試過的是查看該問題的答案。但是我沒有找到一個。

我的問題:我如何在後臺重複一個函數,而程序仍然可以繼續運行,並且可以與其他函數正常運行。一切都應該仍然有效,但功能應該始終在後臺運行。

我也做了一些谷歌搜索,我發現大多數是不斷重複只運行該功能,而不是繼續其他功能。

+5

你想要一個[thread](http://en.cppreference.com/w/cpp/thread/thread)。 –

回答

2

使用std::thread使用此項功能:

#include <thread> 

void foo() { 
    // your code 
} 

int main() { 
    std::thread thread(foo); 
    thread.join(); 

    return 0; 
} 
+0

具有與我在主題中顯示的代碼相同的代碼,但它仍然不會在後臺運行。注:我已包含線程。 – JarFile

+0

這是一個示例代碼。當然,它是阻塞的,因爲你調用'join()'方法來等待線程完成它的工作。詳細瞭解線程並重構您的代碼。 –

+0

我已經閱讀了關於線程的更多信息,如果我正確的話,我會使用'thread.detach();'無論如何它工作正常,謝謝你的答案。 – JarFile

1

你想要的是一個std::thread正如我在評論中提及。還要注意,你需要一個同步機制,以防止你的全局變量的併發訪問:

double time_counter = 0; 
clock_t this_time = clock(); 
clock_t last_time = this_time; 
const int NUM_SECONDS = 1; 
std::mutex protect; // <<<< 
void repeat() { 
    while (1) { 
     this_time = clock(); 

     time_counter += (double)(this_time - last_time); 
     last_time = this_time; 
     if (time_counter > (double)(NUM_SECONDS * CLOCKS_PER_SEC)) { 
      time_counter -= (double)(NUM_SECONDS * CLOCKS_PER_SEC); 
      std::lock_guard<std::mutex> lock(protect); // <<<< 
      rockSecPast++; 
     } 
    } 
} 

,做同樣的在你的主線程

std::thread t(repeat); 
t.detach(); 

// .... 

int currentRockSecPast = 0; 
{ 
    // read the asynchronously updated value safely 
    std::lock_guard<std::mutex> lock(protect); 
    currentRockSecPast = rockSecPast; 
} 

如果我是你,我會把上面所有的東西放在一個單獨的課堂上。

相關問題