在 windows 控制台中排队

Posted

技术标签:

【中文标题】在 windows 控制台中排队【英文标题】:Go line up in windows console 【发布时间】:2014-06-19 13:39:39 【问题描述】:

您似乎可以使用\b 在控制台中从当前行返回一个字符。但是,控制台似乎无法跳出一行。

我想将无效的用户输入标记为红色。键入输入后,用户按 Enter 将不可擦除的新行放入控制台。

我的计划是做以下事情:

    检查input 的有效性。 如果无效,打印input.length()+1\b 将控制台颜色变为红色 打印input,打印\n

但是,\b 不会跳回到用户输入所在的行。所以我有B计划:

    记住用户输入之前的字符串长度 (query_string) 检查input 的有效性。 如果无效,就去排队(输入的地方) 跳转到query_string.length()字符 将控制台颜色变为红色 打印input,打印\n

但是,我不知道如何使用 console API 来做到这一点。

【问题讨论】:

SetConsoleCursorPosition。当我在做的时候,SetConsoleTextAttribute 【参考方案1】:

至少有两种方法可以做到这一点。

正如@chris 在评论中暗示的那样,一种方法是保存用户开始输入的光标位置。当您发现输入错误时,您将光标设置回该位置并更改他输入的字符的文本属性。

您可能不想将窗口向后滚动一行。如果你这样做了,那么当用户出错时,窗口就会出现“跳跃”。这是一个非常不和谐的用户界面体验。不过如果你想试试,可以拨打ScrollConsoleScreenBuffer。

另一种方法是change the console mode,这样它就不会在用户键入字符时自动回显字符。相反,您单独读取每个字符,将其附加到输入缓冲区,并在用户按下 Enter 时验证。如果输入有效,则发出换行符以移至下一行。否则,您将备份并突出显示错误的输入。这听起来需要做更多的工作,但并不难,而且会带来更好的 UI 体验。

【讨论】:

以上是关于在 windows 控制台中排队的主要内容,如果未能解决你的问题,请参考以下文章

40 windows_40_Thread_Mutex 线程 - 互斥

Sentinel流控-排队等待

项目中怎么控制多线程高并发访问

如何在 Rails 控制台中运行 ActiveJob 进行调试?

如何使用 Rspec 检查 ActiveJob 中排队的内容

如何在 Linux 下使用 TC 优雅的实现网络限流