在Ubuntu
中,我想編寫一個C++
程序,只要按下鍵q
就會退出程序。在此之前,程序繼續運行。但是,不僅僅是一個在每次迭代中檢查輸入的循環,我想調用一個函數,然後調用其他函數等等。所以,我不能只是繼續檢查循環中的輸入,因爲該循環從未重新訪問。我是否需要爲此編寫一個單獨的線程,該線程檢測鍵盤輸入,或者是否有可以使用的構建到Ubuntu的內容?在Ubuntu C++中檢測鍵盤按壓
回答
這要看環境是你的程序運行。
如果它在桌面上運行,它是一個GUI應用程序,並且您需要一些圖形工具包,如Qt或Gtk(以避免直接X11編程)。您也可以考慮使用libsdl
如果它在終端中運行,您最好使用一些終端庫,如ncurses(或者,如果您想要一個行版本,readline)。請閱讀tty demystified網頁。請注意,控制檯tty可能是生的或熟的(在這種情況下,行緩衝部分發生在內核中!)。
您可能還需要一些event loop(但Qt給你一個),所以請閱讀poll(2)。
如果你不熟悉它,也看過Advanced Linux Programming。
只要閱讀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;
}
如果不是循環,我想調用一個可以執行某些操作的函數。在處理該函數期間,如果按下'p',我也希望程序退出。所以,在這種情況下,我不能等到函數返回再次檢查輸入。 – Karnivaurus
這很棘手。功能完成處理需要多長時間?你可以讓它在一個單獨的線程中運行,但是一旦用戶按下'q',你必須發信號通知函數停止。您希望中斷的功能是否在循環中運行? – ventsyv
- 1. 在虛擬鍵盤上檢測按鍵
- 2. 在UIWebView中檢測鍵盤按下
- 3. 檢測鍵盤按下
- 4. AS3檢測多個鍵盤按鍵
- 5. iOS Swift藍牙鍵盤按鍵檢測
- 6. 檢測Tab鍵按下藍牙鍵盤
- 7. 未檢測到鍵盤的按鍵
- 8. 鍵盤檢測
- 9. TAPI,C#:檢測電話鍵盤上的按鍵
- 10. c#鍵盤按鍵檢測優先級問題
- 11. 如何檢測iPhone中按下的鍵盤按鍵?
- 12. 在Python中輪詢鍵盤(檢測按鍵)
- 13. 如何檢測鍵盤在iOS 8中按下「PAGE UP」鍵?
- 14. UWP檢測鍵盤按下並釋放
- 15. 鍵盤AS3檢測
- 16. 檢測iPad的鍵盤隱藏按鈕
- 17. 檢測鍵盤搜索按鈕
- 18. LWJGL鍵盤和鼠標檢測按
- 19. 在android軟鍵盤中禁用/檢測鍵盤解鎖鍵
- 20. Java的檢測U盤在Ubuntu與file.listFiles()
- 21. 在edittext中檢測按鍵
- 22. 從屏幕和/或外部鍵盤檢測iOS中的按鍵
- 23. 檢測點擊並保持在iOS鍵盤按鍵
- 24. 如何檢測在textfield鍵盤上按哪個鍵?
- 25. 在PyQt4中檢測鍵盤事件
- 26. 在javascript中檢測鍵盤錯誤
- 27. 檢測按鍵
- 28. 檢測按鍵
- 29. 在windows store app/winRT中檢測多個鍵盤按下
- 30. 檢測隱藏Ipad Iphone在Javascript中的鍵盤按鈕
[檢測C密鑰按不提示用戶(可能重複http://stackoverflow.com/questions/4293355/detecting-key -press-in-c-without-prompting-the-user) – Borgleader
該解決方案只是運行一個循環,而不是運行一個單獨的線程,並允許程序在此期間正常運行。 – Karnivaurus
你從來沒有說過它必須在一個線程。從你的問題:「我需要爲此寫一個單獨的線程」。如果您有要求,請清楚說明。 – Borgleader