- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个简单的计时器。它在一个与主线程分开的线程中运行的函数中。使用 std::future
,该函数返回一个简单的 bool 值,表示计时器是否达到特定数字。
我正在使用 getch();
查看用户是否按下了字母键。
如果计时器返回真,即它命中了指定的数字,我需要取消getch()
;并转到代码中的下一步。进入下一步很容易。
已经 2 周了,我找不到解决问题的方法。
问题: 我究竟该如何中断或取消对 getch();
的调用?这可能吗?
我正在使用 getch();
来识别按下了哪些字母键。
C++11 Visual Studio。
最佳答案
操作系统必须提供对键盘的访问。因此,例如在 Windows 上,最好的方法可能是按照操作系统的术语处理输入,如 here 所述。 .
使用标准的 c++ 库函数,可以从 std::cin
流中读取字符。问题在于,这些字符仅在用户按下 Enter(同时添加换行符 \n
字符)后才从操作系统传递。
如果您可以忍受在键入一个字符后按回车键的需要,那么下面的代码就可以工作了。该程序执行 get()
在一个单独的线程中,这样如果没有按下任何键或者如果 Enter 没有被按下并且只使用标准的 c++11,它就不会阻塞程序。但是,除非用户键入 q
或 sends the EOF
,否则该程序不会完成(即加入线程) .
#include <iostream>
#include <string>
#include <chrono>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
std::condition_variable cv{};
std::mutex mtx;
std::queue<char> char_queue{};
bool quit{false};
void add_chars_to_queue()
{
char c{};
for(;;) {
c = static_cast<char>(std::cin.get());
if(!std::cin) {
std::unique_lock<std::mutex> lck{mtx};
quit = true;
cv.notify_all();
return;
}
if(c == 'q' || c == 'Q') {
std::unique_lock<std::mutex> lck{mtx};
quit = true;
char_queue.push(c);
cv.notify_all();
return;
}
if(c == '\n')
continue;
std::unique_lock<std::mutex> lck{mtx};
char_queue.push(c);
cv.notify_all();
}
}
std::string get_key_or_wait(std::chrono::system_clock::duration d)
{
std::unique_lock<std::mutex> lck{mtx};
for(int i{10}; i > 0; --i) {
cv.wait_for(lck, d / 10., []() {return quit || !char_queue.empty(); });
if(!char_queue.empty())
break;
if(quit)
return{"Quitting.\n"};
std::cout << "Countdown at " << i << '\n';
}
std::string return_string{};
if(!char_queue.empty()) {
return_string += "Obtained a character from the stream before the timer ran out. Character was: ";
return_string += char_queue.front();
char_queue.pop();
}
else {
return_string = "Timer ran out.";
}
return return_string;
}
int main()
{
std::thread get_chars{[]() {add_chars_to_queue(); }};
std::cout << "Type q to exit.\n";
for(int i{}; i < 3; ++i) {
{
std::lock_guard<std::mutex> lck{mtx};
if(quit)
break;
}
std::cout << "Waiting for key press followed by <enter>.\n";
std::cout << get_key_or_wait(std::chrono::seconds(10)) << '\n';
}
get_chars.join();
return 0;
}
输出:
Type q to exit.
Waiting for key press followed by <enter>.
Countdown at 10
Countdown at 9
Countdown at 8
a
Obtained a character from the stream before the timer ran out. Character was: a
Waiting for key press followed by <enter>.
Countdown at 10
Countdown at 9
Countdown at 8
Countdown at 7
Countdown at 6
Countdown at 5
Countdown at 4
Countdown at 3
Countdown at 2
Countdown at 1
Timer ran out.
Waiting for key press followed by <enter>.
Countdown at 10
Countdown at 9
Countdown at 8
bCountdown at 7
Countdown at 6
Countdown at 5
Obtained a character from the stream before the timer ran out. Character was: b
q
关于C++ 中断或取消 getch();,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41368759/
我正在学习C语言编程,但是我遇到了一个问题。我无法在Xcode中使用函数getch和getche。我在我的项目中包含了 header 和 ,但它说 getch 和 getche 是 undefined
我在 Linux 中找不到 conio.h 的等效头文件。 getche() & getche() 在 Linux 中有没有选项? 我想制作一个 switch case 基本菜单,用户只需按一个键就可
在 C 中,我可以使用 getch() 获取输入而无需用户按下回车键。 C++ 中是否有执行 getch() 功能的标准函数。我不想使用 conio.h 或其他特定于平台的库。 while (choi
我正在尝试打印一条消息,然后使用以下代码段将用户的单个字符作为输入。 import getch print("Enter a character: ", end="") char = getch.ge
我想使用 libev 来监听终端中的键盘(击键)事件。我的想法是使用 (n)curses getch() 并设置 notimeout() (非阻塞)来告诉 getch() 不要等待下一次按键。 是否有
今天我正在测试按键在 C++ 中的工作方式并为其制作了简单的循环,并发现 getch() 出于某种原因会自我复制,或者说老实说发生了什么,看看: #include #include #includ
我正在从 C 上的控制台制作“蛇”,我需要“自动返回”一个值以在一段时间后获取,如果用户不按任何键,我需要移动蛇。 最佳答案 (代表 OP 发布)。 最简单的方法是在提交 getch 之前使用 kbh
源代码如下,if(getch()==13)这行是什么意思..int main() { int a[4],approx[4],b[4],i=0; int arr[4][6],sarr[4][6];
我尝试使用 getch() 和 kbhit() 来读取用户的输入,但它似乎无法识别按下了某个键。 void main(){ printf("start\n"); while (1){
我无法让文本显示在控制台上,也无法正确保存。我得到了箭头键、回车键、退格键和 escpe 功能。 还有一个我没有真正得到的/small/错误是当我按 esc 键并且它从空白处退出时我被引导到这段代码
我在使用 getch() 时遇到问题curses 的功能图书馆。假设我们有以下程序: import curses def main(stdscr): while 1: c =
我有一个简单的计时器。它在一个与主线程分开的线程中运行的函数中。使用 std::future,该函数返回一个简单的 bool 值,表示计时器是否达到特定数字。 我正在使用 getch(); 查看用户是
我正在尝试使用 ncurses 并使用它,以便稍后为程序制作界面。在下面的代码中,为什么我必须使用 getch()?如果我不放 getch(),它就不起作用。我怎样才能避免使用 getch()?谢谢!
我正在尝试获取数组中某些字符的位置。我在下面使用这段代码,但在我只输入两个字符后出现运行时错误。 #include #include #include int main() { char
这个问题在这里已经有了答案: How to read a single character from the user? (26 个答案) 关闭 5 年前。 我在做游戏。我希望人们运行 main.p
当我看到在某些情况下 C 会跳过一些输入时,我感到很惊讶。在我的例子中,我使用的是带有 Code::Blocks(xterm) 的 Ubuntu。例如,如果我有以下部分代码: scanf("%d",&
正在做类作业并且已经与 ncurses 斗争了一段时间(这对我来说是新的)。创建一个能够通过网络与同一程序的另一个实例进行通信的程序。该程序的一部分是交互式地从键盘获取字符并将它们发送到接收端。 (我
我在汇编语言中编程,在 C++ 中使用 x86,我需要知道汇编语言中的 getch 等价物而不是 C++ 语言,因为我不想使用 C++ 编程语言中的任何函数。 我在网上找到了代码,但它将给定值保存到一
假设 ncurses header 存在并且我的 random_number_generator() 方法正在运行。我试图通过点击“a”退出循环(最终我想通过点击 CtrlE 退出)。 我的代码继续按
我正在尝试在标准控制台中制作俄罗斯方 block 游戏。我需要非阻塞 getch(),这样 block 就可以在不按任何键的情况下掉落。如果没有按键则返回 -1 的函数会很好,否则返回键码。 最佳答案
我是一名优秀的程序员,十分优秀!