簡體   English   中英

是否可以從ruby GUI腳本(.rbw)啟動控制台進程

[英]Is it possible to start console process from ruby GUI script (.rbw)

我有一個GUI Ruby工具,需要生成一個子命令行過程,例如ping。 如果我在Windows上執行此操作,控制台窗口將出現,並且在控制台過程中消失,這非常煩人。 是否可以從沒有控制台窗口的GUI Ruby腳本啟動進程? 如果我使用反引號運算符或Kernel#system ,則將顯示控制台窗口,請參見以下示例:

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

在此處輸入圖片說明

問題在於,Windows上的每個可執行文件在生成時都被定義為GUI可執行文件或Console可執行文件(當然,這里有更多詳細信息,但這並不重要)。 運行Ruby腳本的可執行文件是GUI可執行文件(即使您的屏幕快照中只有一個非常簡單的腳本,它也恰好使用Tk來實際構建GUI),而ping可執行文件是Console可執行文件。 如果GUI可執行文件啟動控制台可執行文件,則會自動創建一個控制台以在其中運行該可執行文件。 不能改變這個

當然,情況要復雜得多。 那是因為控制台應用程序實際上可以與GUI一起使用(它只需要執行正確的API調用),並且您可以使用整個技巧目錄來使控制台窗口不受影響(例如,通過適當的方式開始ping操作) -配置的快捷方式文件),但此類操作相當尷尬。 最簡單的方法是通過使Ruby本身成為控制台應用程序(通過使用.rb后綴而不是.rbw命名腳本 )來使控制台窗口始終存在。 是的,它並不能真正解決問題,但是可以消除任何令人討厭的閃爍。

如果您使用ping作為應用程序的目的(例如,確定服務是否啟動),那么我想是否有可能/建議通過連接到服務而不是直接在Ruby中編寫檢查代碼來代替ping它,因為ping只是測量目標OS內核是否處於活動狀態,而不是服務可執行文件。 這是一個很好的區別,但是我已經看到機器進入一種狀態,其中沒有可執行文件在運行,但是機器仍在響應ping。 這是非常奇怪的,可以完全破壞您的心理抽象,但是可能發生。 但是由於您僅以ping為例,所以我認為您可以只關注(而不是有問題的)控制台處理。 不過,如果您可以在不運行子進程的情況下做到這一點,那么絕對可以選擇該方法(在Windows上;如果您使用的是任何類型的Unix,則根本不會出現此問題)。

確實有可能使用Ruby生成進程。 這是幾種方法 我不確定你的意思

控制台窗口將出現,並在控制台過程中消失

但是我認為您最好的方法就是簡單地抓住並犯錯,然后在自己的窗口中顯示給用戶。 如果要顯示本機Windows控制台,則可能需要使用Windows腳本編寫一些內容。

使衍生的控制台保持活動的一種方法是讓它在末尾運行帶有PAUSE命令的批處理文件:

rungping.bat:

ping %1
pause
exit

在您的ruby文件中:

Thread.new {`start runping.bat 8.8.8.8`}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM