异步控制台输出

时间:2011-02-04 14:19:47

标签: c++ winapi logging console

我的应用程序win32控制台出现问题。

控制台用于向我的应用程序发出命令。但是,它同时用于输出主要来自异步线程的日志消息。当用户尝试写入某些输入并同时打印异步日志消息时,这就成了一个问题,从而破坏了用户输入的显示。

我想就如何处理这种情绪提出一些建议?

例如,是否可以将控制台中的最后一行专用于输入,类似于某些游戏的游戏内控制台的外观?

3 个答案:

答案 0 :(得分:6)

您可以使用SetConsoleMode禁用输入回显和线路编辑模式。然后,只要程序准备就绪,您就可以回显输入。请注意,这意味着您需要手动执行backspace之类的操作。并且不要忘记在完成控制台后重新启动模式!

答案 1 :(得分:3)

这可以使用Console API,但它涉及相当多的工作,并且使用控制台的所有线程都必须通过调用输出方法而不是直接调用Console API函数或运行时库输出函数来进行协作。

基本思想是让您的公共输出函数写入控制台屏幕缓冲区,并在代码中滚动缓冲区,而不是让文本流到最后一行并自动滚动。我记得,你必须解析换行符和其他控制字符的输出,并正确处理它们。

可能能够在最后一行使用“熟”控制台输入,但如果这样做,如果用户输入的文字多于单行上的文字,则存在问题。此外,用户在该行的末尾点击Enter可能会导致它向上滚动。在这种情况下使用原始控制台输入可能是最好的。

您希望对Windows consoles非常熟悉。

答案 2 :(得分:2)

任何时候你有异步线程试图同时更新同一个设备,你会遇到类似这样的问题,除非它们同步它们。

如果您可以访问每个人的源代码,那么要做的事情可能是创建某种同步对象,每个任务都必须使用它来访问控制台(信号量等)。