0
爲了好玩,我在C上編寫了一個CPU模擬器,我希望它以非阻塞的方式處理它自己的IO:如果有按鍵,返回該按鍵的字符值,否則返回0。在C語言下的快速非阻塞鍵盤IO下MinGW
目前我使用如下:
#include <conio.h>
...
unsigned int input(){
unsigned int input_data;
if (_kbhit()){
input_data = (unsigned int)_getch();
}
else{
input_data = 0;
}
return input_data;
}
而在功能方面,它是好的。我遇到的一個問題是,它對仿真器的速度是非常不利的 - 仿真器可以從每秒6千萬條指令轉到幾十萬甚至幾十萬的規模,只需運行帶有大量IO指令的程序即可。有沒有更快的方式來做到這一點,同時仍然保持相同的功能?
爲什麼不直接使用'_getch()'? [從MSDN](https://msdn.microsoft.com/en-us/library/078sfkak.aspx):_ _getch和'_getwch'函數從控制檯讀取單個字符而不回顯字符._在其他單詞,一旦檢測到按鍵,函數返回。不需要'_kbhit()'。您也可以使用['WaitForSingleObjectEx()'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms687036(v = vs.85).aspx)等待控制檯輸入句柄,並且如果超時在您收到輸入之前結束,那麼您不會阻止程序的其餘部分。 –
@ChronoKitsune我相信我已經嘗試過_getch()之前。如果我沒有記錯(儘管我可能是錯的),它會等待按鍵,而如果沒有按鍵,我想立即返回。我會試着在這個問題上說清楚一些。我一定會考慮WaitForSingleObjectEx()。謝謝。 – Xandros
明顯的解決方案:KB閱讀器線程和一個volatile字符?你只需要檢查模擬器循環中的字符:) –