ruby - 是否可以从 ruby​​ GUI 脚本 (.rbw) 启动控制台进程

标签 ruby windows tk-toolkit

我有一个 GUI Ruby 工具需要生成一个子命令行进程,例如 ping。如果我在 Windows 上执行此操作,控制台窗口将出现并消失以进行控制台进程,这非常烦人。是否可以从不显示控制台窗口的 GUI Ruby 脚本启动进程?如果我使用反引号运算符或 Kernel#system,将出现控制台窗口,请参见下面的示例:

require 'Tk'
require 'thread'
Thread.new { `ping 8.8.8.8` }
TkRoot.new.mainloop

enter image description here

最佳答案

问题是 Windows 上的每个可执行文件在构建时都被定义为 GUI 可执行文件或控制台可执行文件(好吧,还有更多细节,但这里并不重要)。运行您的 Ruby 脚本的可执行文件是一个 GUI 可执行文件(它也碰巧使用 Tk 来实际构建一个 GUI,即使您的屏幕截图中只有一个非常简单的 GUI)并且 ping 可执行文件是一个控制台可执行文件。如果 GUI 可执行文件启动控制台可执行文件,则会自动创建一个控制台来运行可执行文件; 不能改变它

当然,情况要复杂得多。这是因为控制台应用程序实际上可以与 GUI 一起工作(它只需要执行正确的 API 调用)并且您可以使用一整套技巧来使控制台窗口不受影响(例如通过适当的方式启动 ping -configured shortcut file) 但这样的事情相当尴尬。最简单的方法是让 Ruby 本身成为一个控制台应用程序(通过 naming your script with the .rb suffix, not .rbw ),让控制台窗口始终在那里。是的,它并没有真正解决问题,但它停止了任何烦人的闪烁。

如果您使用 ping 作为您的应用程序的目的(即查明服务是否正常运行),那么我认为是否可能/建议通过连接到直接在 Ruby 中编写检查代码服务而不是 ping 它,因为 ping 只测量目标操作系统内核是否存在,而不是服务可执行文件。这是一个很好的区别,但我已经看到机器进入一种状态,即没有可执行文件在运行,但机器仍在响应 ping;这非常很奇怪,可以完全打破你的思维抽象但有可能发生。但是由于您仅以 ping 为例,我认为您可以只关注(相当有问题的)控制台处理。尽管如此,如果您可以在不运行子进程的情况下做到这一点,那么一定要选择该方法(在 Windows 上;如果您在任何类型的 Unix 上,您根本不会遇到这个问题)。

关于ruby - 是否可以从 ruby​​ GUI 脚本 (.rbw) 启动控制台进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9162483/

相关文章:

python - 如何使用不会在复制/粘贴时崩溃的代理来跟踪 tkinter 文本小部件是否已被修改?

python - tkinter 窗口获取没有窗口顶部的 x、y、几何/坐标

ruby - 全新安装 compass-inuit 后,启动 "compass watch"时出现错误

ruby-on-rails - Rails 3.1 中 `respond_with` 和 `respond_to` 的异常行为

python - 将 Ruby 移植到 Python

ruby - 在 ruby​​ 中将值打印到小数点后两位

Windows上的C自动启动程序无法使用文件

windows - 在 Windows 批处理脚本中的特殊字符的倍数之后截断文件名?

python - 如何在 python 中使用 ctypes 获取 Windows 窗口名称

Perl Tk 键绑定(bind)进入