Qt использовать, Qprocess запустить внешнюю программу
предисловие
В этой статье я в основном говорю о мерах предосторожности при использовании Qtcess Qprocess для вызова внешних программ, и я не буду здесь говорить о методе настройки Qt. В то же время, поскольку в Интернете уже много справочных материалов, я в основном подчеркиваю некоторые детали, которые требуют внимания.
Терминологическая конвенция:
- Основная программа: программа, которая будет вызывать стороннюю программу, код вызова находится в программе;
- Внешняя программа: программа, запускаемая основной программой, в формате .exe,
1 Связанные справочные блоги и материалы
2 Вопросы, требующие внимания
(1) Запустите внешнюю программу
Класс Qprocess предоставляет три интерфейсные функции для запуска внешних программ, а именно:
QProcess::Start(***) void start(const QString arguments, QIODevice::OpenMode mode = ReadWrite) void start(const QString bool startDetached(const QString arguments, const QString command) Qprocess::Execute(***); int execute(const QString arguments) int execute(const QString program, const QStringList
process.setReadChannelMode(ForwardedChannels);
process.start(program, arguments);
if (!process.waitForFinished(-1) || process.error() == FailedToStart)
return -2;
return process.exitStatus() == QProcess::NormalExit ? process.exitCode() : -1;
>
(2) Запускать несколько внешних программ параллельно
Или для запуска одной и той же программы несколько раз, вы можете использовать функцию start () или startDetaached () для запуска. Вы не можете использовать execute () для одновременного запуска нескольких программ. Execute () выполняется последовательно. Только после выполнения исполняемой программы будет выполняться следующий код.
Метод: Сначала используйте интерфейс start () для последовательного запуска процесса нескольких внешних программ, а затем вызовите функцию ожидания завершения после завершения запуска. Псевдокод выглядит следующим образом:
(3) Как получить вывод внешней программы и вывести его в главное окно или записать в журнал?
Если вы используете execute () для запуска внешней программы, она автоматически распечатает информацию в главном окне программной консоли;
Если вы используете start () для запуска внешней программы, вам необходимо вручную прочитать и записать выходные данные внешней программной консоли. Метод вывода см. В:
Например: подпрограмма a, основная программа A
Вы можете использовать сигнальный слот для подключения входа и выхода двух программ. Примечание:
- Для ввода и вывода подпрограммы необходимо использовать стандартный ввод и вывод, std :: cout
- Необходимо добавить слоты в основную программу, чтобы объявить функцию корреляции сигналов, например: private slots://add slots output()
//…
> - Чтобы решить проблему, заключающуюся в том, что Qt преобразует китайские выходные символы новой строки в недействительные, QString.split (QRegExp («[ r n]»), QString :: SkipEmptyParts);
// Примечание: ниже приведен псевдокод, который не гарантирует правильность существительных в английском языке. a_main() < std::coutclass A : public Qobject < public: Qprocess *Pro_; void StartExternApp() < Pro_=new Process(this); pro_->start(command,params); // Установить соединение со стандартным выходом внешнего субмодуля connect(process_, SIGNAL(readyRead()), this, SLOT(output())); Pro_->WaitForFinished(-1); delete Pro_; > private slots://add slots output() < QByteArray byteArray = process_->readAllStandardOutput(); QString str = QString::fromLocal8Bit(byteArray); QStringList strList=str.split(QRegExp(«[rn]»), QString::SkipEmptyParts); for (int i = 0; i < strList.size(); ++i) < qDebug() > >
(4) Настройка рабочего каталога
Это в основном влияет на относительный путь в программе. Если программа использует относительный путь для чтения файлов в нижней папке программы, его необходимо изменить.
Как работают Portable-программы
- Используйте start, чтобы установить рабочий каталог внешней программы;
- Использование параметра execute недопустимо, может наследовать только рабочий каталог основной программы , Это вызовет проблему, если внешняя программа использует относительный путь для доступа к нижнему файлу папки, в которой расположена программа, будет Не удалось найти файл!
Qt программирование QString разрыв строки
При использовании слота сигнала для чтения выходных данных внешней программы на китайском языке возникла проблема: после преобразования на китайский разрыв строки в выходных данных внешней программы будет недействительным. Из-за статьи, написанной между Unix, Windows и Mac, разрывы строк не одинаковы, что приводит к различной обработке. Теперь я буду использовать QString для разделения строк (прочитанные текстовые файлы имеют разрывы строк). Итак, возьмите эти три строки
Просто используйте регулярное выражение QRegEx:
Список, возвращаемый таким образом, разделен на строки.
Источник: russianblogs.com
Как написать программу которая будет запускать другу программу?
Помогите пожалуйста найти пример кода который бы запускал .exe файл с параметром:
Алгоритм:
1. Чтение параметра из файла
2. Командная строка которую нужно выполнять много раз(с каждым параметром из файла 1 раз):
myfile.exe -1 -hhhh -h -ПАРАМЕТР И ФАЙЛА(zzzzzz)
3. Таймер 10 минут, потом выключение запущенного myfile.exe
4. Если в файле остались параметры с которым не была запущена программа возврат к шагу 2, если все параметры уже были запущены то Happy End и программа закончила работу.
Содержание файла с параметрами:
aaaaaa
bbbbbb
ccccccc
dddddd
.
zzzzzz
- Вопрос задан более трёх лет назад
- 713 просмотров
3 комментария
Простой 3 комментария
Источник: qna.habr.com
Как написать программу чтобы она запускала другую программу
16.11.2011 |
Автор Bestlis
Для того, чтобы из приложения написанного на c# запустить другое приложение, необходимо использовать класс Process пространства имен System.Diagnostics
using System.Diagnostics;
Приведенный выше код, запускает пустой текстовый редактор. Если вы хотите запустить Блокнот с открытым файлом, то необходимо в метод Start передать параметры (например для Блокнота, необходимо передать путь к файлу, который необходимо открыть, для Internert Explorer – адрес URL):
//запускаем блокнот с файлом some.txt Process.Start(«Notepad.exe», «some.text»); //запускаем браузер с заданным адресом URL Process.Start(«iexplore.exe»,»csharpcoding.org»);
Бывает ситуация, когда нужно запустить другое приложение из своей программы и не дать пользователю возможность закрыть нашу программу:
Таким образом, пока не будет закрыт блокнот, нашу программу невозможно будет закрыть.
Материал взят из книги Александра Климова «C# советы программистам»
Источник: csharpcoding.org