Можно ли запустить консольный процесс из сценария ruby ​​GUI (.rbw) - PullRequest
1 голос
/ 06 февраля 2012

У меня есть инструмент Ruby с графическим интерфейсом, который должен порождать дочерний процесс командной строки, например ping. Если я сделаю это в Windows, появится окно консоли и исчезнет для процесса консоли, что очень раздражает. Можно ли запустить процесс из сценария Ruby с графическим интерфейсом без видимого окна консоли? Если я использую оператор backtick или Kernel#system, появится окно консоли, см. Пример ниже:

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

enter image description here

Ответы [ 3 ]

2 голосов
/ 08 февраля 2012

Проблема заключается в том, что каждый исполняемый файл в Windows определяется как исполняемый файл с графическим интерфейсом или как исполняемый файл консоли (ну, есть больше подробностей, чем это, но это не имеет значения) во время сборки.Исполняемый файл, на котором выполняется ваш Ruby-скрипт, является исполняемым файлом с графическим интерфейсом (он также использует Tk для создания графического интерфейса пользователя, даже если на скриншоте он очень простой), а исполняемый файл ping - это исполняемый файл консоли.Если исполняемый файл GUI запускает исполняемый файл консоли, консоль автоматически создается для запуска исполняемого файла; Вы не можете изменить это .

Конечно, картина более сложная, чем эта.Это потому, что консольное приложение может фактически работать с графическим интерфейсом (ему просто нужно делать правильные вызовы API), и вы можете использовать целый каталог трюков, чтобы заставить окно консоли оставаться в стороне (например, запускать ping через соответствующий-конфигурированный файл ярлыка) но такие вещи довольно неловкие.Самый простой способ состоит в том, чтобы окно консоли было там все время, если бы сам Ruby был консольным приложением (через с именем суффикса .rb, а не .rbw).Да, это на самом деле не избавляет от проблемы, но перестает раздражать перепрошивку.

Если вы использовали ping в качестве цели вашего приложения (т. Е. Чтобы выяснить, работали ли службы), тогда яМожно ли / целесообразно переключиться на написание проверочного кода непосредственно в Ruby, подключившись к сервису, а не пропингуя его, так как ping просто измеряет, живо ли целевое ядро ​​ОС, а не исполняемый файл сервиса.Это отличительная черта, но я видел, что машины попадали в состояние, когда исполняемые файлы не выполнялись, но машина все еще отвечала на эхо-запросы;это было очень странно и может полностью сломать ваши умственные абстракции, но может случиться.Но так как вы используете только ping в качестве примера, я думаю, вы можете просто сосредоточиться на (довольно проблематичной) обработке консоли.Тем не менее, если вы можете сделать это без запуска подпроцесса, тогда определенно выберите этот метод (в Windows; если бы вы работали в любом виде Unix, у вас вообще не было бы этой проблемы).

1 голос
/ 07 февраля 2012

Один из способов сохранить порожденную консоль - запустить пакетный файл с командой PAUSE в конце:

rungping.bat:

ping %1
pause
exit

В вашемРубиновый файл:

Thread.new {`start runping.bat 8.8.8.8`}
1 голос
/ 07 февраля 2012

Действительно возможно порождать процессы с Ruby. Вот пара способов сделать это . Я не уверен, что ты имеешь в виду под

Окно консоли появится и исчезнет для процесса консоли

но я думаю, что лучший способ сделать это - просто взять и ошибиться и показать его своему пользователю в собственном окне. Если вы хотите, чтобы родная консоль Windows появлялась, вам, возможно, понадобится что-то необычное в сценариях Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...