2015-01-05 144 views
-1

Ubuntu中,我想編寫一個C++程序,只要按下鍵q就會退出程序。在此之前,程序繼續運行。但是,不僅僅是一個在每次迭代中檢查輸入的循環,我想調用一個函數,然後調用其他函數等等。所以,我不能只是繼續檢查循環中的輸入,因爲該循環從未重新訪問。我是否需要爲此編寫一個單獨的線程,該線程檢測鍵盤輸入,或者是否有可以使用的構建到Ubuntu的內容?在Ubuntu C++中檢測鍵盤按壓

+2

[檢測C密鑰按不提示用戶(可能重複http://stackoverflow.com/questions/4293355/detecting-key -press-in-c-without-prompting-the-user) – Borgleader

+0

該解決方案只是運行一個循環,而不是運行一個單獨的線程,並允許程序在此期間正常運行。 – Karnivaurus

+0

你從來沒有說過它必須在一個線程。從你的問題:「我需要爲此寫一個單獨的線程」。如果您有要求,請清楚說明。 – Borgleader

回答

2

這要看環境是你的程序運行。

如果它在桌面上運行,它是一個GUI應用程序,並且您需要一些圖形工具包,如QtGtk(以避免直接X11編程)。您也可以考慮使用libsdl

如果它在終端中運行,您最好使用一些終端庫,如ncurses(或者,如果您想要一個行版本,readline)。請閱讀tty demystified網頁。請注意,控制檯tty可能是生的或熟的(在這種情況下,行緩衝部分發生在內核中!)。

您可能還需要一些event loop(但Qt給你一個),所以請閱讀poll(2)

如果你不熟悉它,也看過Advanced Linux Programming

-1

只要閱讀stdin和判斷是否「Q」

#include <iostream> 
#include <boost/thread.hpp> 
using namespace std; 

void workerFun(const bool& stopFlag) 
{ 
    //Do stuff 
    if stopFlag 
     return; // probably want to have some logic to clean up, save progress etc 
} 

int main() 
{ 
    bool flag = false; 
    //Start the worker in another thread 
    boost::thread workerThread(workerFun, std::ref<bool>(flag)); 

    //Keep checking if the user wants to quit 
    do 
    { 
     cout<<"Enter q to quit"<<endl; 
     char input; 
     cin>>input; 
     flag = input == 'q' || input == 'Q' 
    } while (!flag); 
    //user want's to quit, wait for the worker to stop 
    workerThread.join(); 

    cout << "Goodbye!"<<endl; 
    return 0; 
} 
+0

如果不是循環,我想調用一個可以執行某些操作的函數。在處理該函數期間,如果按下'p',我也希望程序退出。所以,在這種情況下,我不能等到函數返回再次檢查輸入。 – Karnivaurus

+0

這很棘手。功能完成處理需要多長時間?你可以讓它在一個單獨的線程中運行,但是一旦用戶按下'q',你必須發信號通知函數停止。您希望中斷的功能是否在循環中運行? – ventsyv