【发布时间】:2015-01-12 13:34:27
【问题描述】:
在我的 Windows Tcl 8.5 应用程序中拦截 Ctrl-C 时遇到问题。我在我开发的扩展库中添加了一个控制台处理程序,但它并不总是有效。
如果某些 Tcl 代码正在执行,那么一切正常。但如果应用程序正在等待用户输入,按 Ctrl-C 会终止它。我的处理程序被调用,但同时(在不同的线程中?)Tcl REPL 调用Tcl_Exit。这真的把一切都搞砸了。
据我所知,REPL 调用Tcl_Exit 是因为它错误地认为stdin 遇到了EOF。反过来,这是由于当按下 Ctrl-C 时,读取例程返回,它返回读取的字节数,即 0。 REPL 将此条件解释为 EOF。
有没有简单的方法来解决这个问题?我知道我可以放弃 Tcl 内置通道并提供自己的通道,但这对于这个简单的问题来说似乎有点过头了。
我已经尝试过twapi::set_console_control_handler,但它似乎根本不起作用。按 Ctrl-C 总是会终止应用程序,并且永远不会调用处理程序。
【问题讨论】:
-
我尝试了一个快速的 critcl 内置扩展来调用 SetConsoleCtrlHandler 并获得相同的效果。处理函数被调用,但 tclsh 仍然退出。我怀疑在 twapi 版本中它会引发一个事件来运行脚本并在处理事件之前退出,因此无法调用脚本。 C 处理程序可能正在被调用。
标签: windows tcl interrupt windows-console