所以我想帮助一个朋友做一个项目,他需要一些东西来在每次击键时发出声音。他使用 std::cin 将数据读取为整数值,我想知道是否有可能制作一个函数,该函数不会使用多线程或以某种方式重载 istream>>运算符来修改项目的其余部分,因此每次按键都会发出哔哔声。我试过这个,我知道重载概念可能很糟糕,我可能不明白多线程是如何工作的,但你能重新推荐一些文章,以便我学习解决这种问题吗?也许是 c++ 中的事件处理,但我没有找到任何通用的东西,只是游戏框架中的事件处理。也许一些提示?这是我的代码借口:
#include <iostream>
#include <thread>
#include <string>
#include <conio.h>
#include <windows.h>
using namespace std;
//compile error very bad
istream& operator>>(istream& in, int& n)
{
int i=0;
char c;
string nr;
nr.resize(30);
do{
c = getch();
if(c >= '0' && c<= '9' && i < 30)
{
cout<<c;
Beep(1000, 10);
nr[i++] = c;
}
if(c == 'b')
{
i--;
cout<<"b b";
}
}while(int(c) != 13);
//maybe like this and return void?
n = stoi(nr);
//or like this? even tho makes no sense to me that it would work?
return in>>stoi(nr);
}
void playBeep()
{
while(getch())
{
Beep(1000, 10);
}
}
int main()
{
//maybe this?
thred t(playBeep);
t.join();
//or this with the operator overload somehow?
int arr[10];
for(int i=0; i<10;i++)
cin>>arr[i];
return 0;
}
PeekConsoleInput
可用于从另一个线程中窥视 stdin。您可能会错过一些事件,因为与主线程没有同步。这应该被视为一种黑客攻击,但可能足以满足您的需求。
如果您愿意放弃 C/C++ stdin API,则可以读取带有ReadConsoleInput
的低级别 Win32 控制台输入事件或带有 ReadFile
或ReadConsole
的文本输入。