2017-05-26 56 views
1

我試圖創建一個反覆多次但每次循環之間都會暫停的函數。沒有暫停控制檯的C++延遲For-Loop

我試圖使用「睡眠」,但暫停控制檯。而且我在網上搜索,只找到平時在暫停遊戲機的答案。

代碼:

int i; 
for(i=0; i<500; i++) { 
    std::cout << "Hello" << std::endl; 
} 

我怎樣才能使打印「Hello」 500次,以及允許用戶使用控制檯它做上述功能的同時?

+1

如果你想允許用戶繼續使用控制檯,您將需要一個額外的線程。即便如此,輸出將與用戶的輸入混合。參見[std :: this_thread :: sleep_for](http://en.cppreference.com/w/cpp/thread/sleep_for)和[std :: async](http://en.cppreference.com/w/cpp /線程/異步)。 –

+0

@FrançoisAndrieux這只是一個例子。在做一些後臺任務時只允許用戶輸入是我的目標。 –

+4

@JohanDoe事情是,嘗試多線程甚至像這樣的基本代碼會有不尋常的後果。當然,可以允許用戶在打印語句之間輸入文本,使用一些基本的多線程,但是你會得到交錯的文本:「ThiHello \ ns是一個用戶,你可以進入控制檯,而\ n「'(顯然'\ n'代碼意思是換行符) – Xirema

回答

0

正如一些人所評論的,您需要創建一個異步任務,以便在處理用戶輸入的同時完成一些工作。

以下是關於如何通過使用線程來完成此任務的最簡單的工作示例。它是基於提升,所以你必須使用-lboost_thread lboost_system掛靠:

g++ test.cpp -lboost_thread -lboost_system -o test 

的代碼有一些意見,以解釋你應該做的:

#include <queue> 
#include <iostream> 
#include <boost/thread.hpp> 

// set by the main thread when the user enters 'quit' 
bool stop = false; 
boost::mutex stopMutex; // protect the flag! 


// the function that runs in a new thread 
void thread_function() { 
    // the following is based on the snippet you wrote 
    int i; 
    for(i=0; i<500; i++) { 
     // test if I have to stop on each loop 
     { 
      boost::mutex::scoped_lock lock(stopMutex); 
      if (stop) { 
       break; 
      } 
     } 

     // your task 
     std::cout << "Hello" << std::endl; 

     // sleep a little 
     ::usleep(1000000); 
    } 
} 


int main() { 
    std::string str; 
    boost::thread t(thread_function); 

    while(true) { 
     std::cout << "Type 'quit' to exit: "; 

     // will read user input 
     std::getline(std::cin, str); 

     if (str == "quit") { 
      // the user wants to quit the program, set the flag 
      boost::mutex::scoped_lock lock(stopMutex); 
      stop = true; 
      break; 
     } 
    } 

    // wait for the async task to finish 
    t.join(); 

    return 0; 
} 
+0

不應該是'boost :: atomic stop;'?編譯器不知道有關正在創建的線程的任何信息,因此可以自由地假定'thread_function()'運行時'stop'永遠不會改變。它可能會將初始值存儲在寄存器中,而不會從內存中更新它。 – zett42

+0

是的,在任何意義上使用原子將會更好 –