2013-07-12 148 views
0

我遇到了問題。我想創建一個程序,在計時器正在進行時等待輸入。我發現使用睡眠不起作用,因爲它會凍結固定時間的程序。我不太瞭解時間參考以及線索參考。我在Mac機中使用Netbeans來做這件事。倒計時定時器線程

我該怎麼做?

+0

這是一個 「控制檯」 或 「GUI」 應用程序? –

+0

@MatsPetersson是的,這是一個控制檯應用程序 –

+0

那麼你將很難做到這一點使用「標準」的功能,因爲與例如'cin'或'getline'等的投入,是不可能停止 - 除非你要退出整個程序。 –

回答

2

既然你是一個Mac上使用OSX您的是:(最有可能),這是POSIX兼容。

然後你就可以使用例如select輪詢標準輸入是否有輸入。 select函數也方便地具有超時功能。

可以使用類似

fd_set input_set; 
timeval timeout; 

FD_ZERO(&input_set); 
FD_SET(STDIN_FILENO, &input_set); 

// Set timeout to one minute 
timeout.tv_sec = 60; 
timeout.tv_usec = 0; 

int result = select(STDIN_FILENO + 1, &input_set, nullptr, nullptr, &timeout); 

if (result == -1) 
    std::cout << "Error in select call: " << strerror(errno) << '\n'; 
else if (result == 0) 
{ 
    // Timeout, do something here 
} 
else if (FD_ISSET(STDIN_FILENO, &input_set)) 
{ 
    std::string input; 
    std::getline(std::cin, input); 

    // Have input, do something with it 
} 
+0

我真的不明白這部分 '否則,如果(FD_ISSET(STDIN_FILENO,與input_set)){ 的std :: string輸入; std :: getline(std :: cin,input); //有投入,用它做的東西 }' 這是什麼意思? –

+0

@JoelSeah'select'調用修改描述符集合,並使用'FD_ISSET'宏/函數來檢查描述符是否在集合中被設置。正文部分從標準輸入流中讀取一行輸入。 –

+0

嗯。那麼每當用戶輸入一個輸入時,我可以在哪裏顯示倒計時的一部分? –