我試圖創建一個反覆多次但每次循環之間都會暫停的函數。沒有暫停控制檯的C++延遲For-Loop
我試圖使用「睡眠」,但暫停控制檯。而且我在網上搜索,只找到平時在暫停遊戲機的答案。
代碼:
int i;
for(i=0; i<500; i++) {
std::cout << "Hello" << std::endl;
}
我怎樣才能使打印「Hello」 500次,以及允許用戶使用控制檯它做上述功能的同時?
我試圖創建一個反覆多次但每次循環之間都會暫停的函數。沒有暫停控制檯的C++延遲For-Loop
我試圖使用「睡眠」,但暫停控制檯。而且我在網上搜索,只找到平時在暫停遊戲機的答案。
代碼:
int i;
for(i=0; i<500; i++) {
std::cout << "Hello" << std::endl;
}
我怎樣才能使打印「Hello」 500次,以及允許用戶使用控制檯它做上述功能的同時?
正如一些人所評論的,您需要創建一個異步任務,以便在處理用戶輸入的同時完成一些工作。
以下是關於如何通過使用線程來完成此任務的最簡單的工作示例。它是基於提升,所以你必須使用-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;
}
不應該是'boost :: atomic
是的,在任何意義上使用原子將會更好 –
如果你想允許用戶繼續使用控制檯,您將需要一個額外的線程。即便如此,輸出將與用戶的輸入混合。參見[std :: this_thread :: sleep_for](http://en.cppreference.com/w/cpp/thread/sleep_for)和[std :: async](http://en.cppreference.com/w/cpp /線程/異步)。 –
@FrançoisAndrieux這只是一個例子。在做一些後臺任務時只允許用戶輸入是我的目標。 –
@JohanDoe事情是,嘗試多線程甚至像這樣的基本代碼會有不尋常的後果。當然,可以允許用戶在打印語句之間輸入文本,使用一些基本的多線程,但是你會得到交錯的文本:「ThiHello \ ns是一個用戶,你可以進入控制檯,而\ n「'(顯然'\ n'代碼意思是換行符) – Xirema