Russian Qt Forum
Ноябрь 22, 2024, 22:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QProcess не работает write  (Прочитано 10458 раз)
updaite
Гость
« : Август 13, 2014, 11:00 »

Здравствуйте, есть код перехвата консоли, с выводом в textEdit.
Код:
void MainWindow::on_pushButton_clicked()
{
    this->proc = new QProcess(this);
    this->proc->setProcessChannelMode(QProcess::MergedChannels); // Устанавливаем, что вывод (и ошибки и прочее) будет валиться в один канал
    connect (this->proc, SIGNAL(readyReadStandardOutput()), this, SLOT(onReady())) ; // ловим когда процесс что то выдал
    connect (this->proc, SIGNAL(readyReadStandardError()), this, SLOT(onReadyError())) ; // ловим когда процесс выдал ошибку
    connect (this->proc, SIGNAL(onFinished()), this, SLOT(onFinished())) ; //ловим когда процесс закончил работу
    proc->start("hlds.exe -game cstrike +port 27015 +map de_dust2 -console");
 
}
 
void MainWindow::onReady()
{
   QString output(QString::fromLocal8Bit(static_cast<QProcess *>(sender())->readAll()));
   if (!output.isEmpty())
   {
     //qDebug() << output;
      ui->textEdit->append(output);
   }
}
 
void MainWindow::onReadyError()
{
    QString output(static_cast<QProcess *>(sender())->readAllStandardOutput ());
    if (!output.isEmpty())
    {
      ui->textEdit->append("Erorr: " + output);
    }
}
 
void MainWindow::onFinished()
{
   qDebug () << "Ура";
    // А так можно прибить процесс
  // this->proc->terminate();
   //this->proc->waitForFinished(10000);
}
 
void MainWindow::on_pushButton_2_clicked()
{
    proc->write("map de_dust\n");
}
Код работает, но приложение hlds не реагирует на команду
Код:
void MainWindow::on_pushButton_2_clicked()
{
    proc->write("map de_dust\n");
}
Пробовал и так
Код:
proc->write("map de_dust\n\r");
hlds.exe имеет возможность принимать команды консольно, как выполнить команду
Код:
proc->write("map de_dust\n\r");
и отобразить результат?
Qt только начал осваивать.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Август 13, 2014, 11:43 »

В QProcess параметры передаются через QStringList. У тебя просто не происходит запуска.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
updaite
Гость
« Ответ #2 : Август 13, 2014, 12:48 »

Если вызываю так то, перехваченные данные свидетельствуют о том что приложение запустилось успешно.
Код:
proc->start("hlds.exe -game cstrike +port 27015 +map de_dust2 -console"); //запускаем процесс

Если вызываю так то, перехваченные данные свидетельствуют что приложение запустилось с ошибкой.
Код:
    QStringList arg;
    arg << "-game cstrike +port 27015 +map de_dust -console";
    proc->start("hlds.exe", arg); //запускаем процесс

Даже если приложение запущено с ошибкой оно всё равно должно принимать команды, Ввод по прежнему не работает.
« Последнее редактирование: Август 13, 2014, 12:58 от updaite » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Август 13, 2014, 13:24 »

Список строк же.

Код
C++ (Qt)
arg << "-game" << "cstrike" <<  "+port" << "27015" << "+map" << "de_dust" << "-console";
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
updaite
Гость
« Ответ #4 : Август 13, 2014, 13:53 »

Список строк же.

Код
C++ (Qt)
arg << "-game" << "cstrike" <<  "+port" << "27015" << "+map" << "de_dust" << "-console";
 
Так запускалось без ошибок, но на команды по прежнему не реагирует, может быть поток ввода заблокирован? А то как то странно, приложение запустило консоль перехватывает вывод из него, а сама консоль просто открыта и пустая.
« Последнее редактирование: Август 13, 2014, 13:58 от updaite » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Август 13, 2014, 13:59 »

1. Попробуй в каждый слот добавить вывод в qDebug и посмотри, что выведет на консоль - вообще попадает ли в эти слоты.
2. Попробуй bool QProcess::waitForStarted(int msecs = 30000)
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
updaite
Гость
« Ответ #6 : Август 13, 2014, 14:03 »

1. Попробуй в каждый слот добавить вывод в qDebug и посмотри, что выведет на консоль - вообще попадает ли в эти слоты.
2. Попробуй bool QProcess::waitForStarted(int msecs = 30000)

Боюсь не получиться так сделать, потому что по каким то причинам hlds запускается только когда вызывается из своей директории, я скомпилированный файл каждый раз копирую в директорию к hlds и от туда запускаю.

Так же побывал вот так.
Код:
    QProcess cmd;
    cmd.setProcessChannelMode(QProcess::MergedChannels);
    QStringList arg;
    arg << "-game" << "cstrike" <<  "+port" << "27015" << "+map" << "de_dust2" << "-console";
    cmd.start("hlds.exe", arg);
    if (cmd.waitForStarted() == NULL)
    {
        return;
    }

    cmd.waitForReadyRead();
    QByteArray result = cmd.readAll();

    cmd.write("cmdlist\n");
    cmd.waitForFinished(9000);

    result = cmd.readLine();
    result = cmd.readAll();
    ui->textEdit->append(result.data());
« Последнее редактирование: Август 13, 2014, 14:05 от updaite » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Август 13, 2014, 14:13 »

1. cmd.start("c:/path/to/hlds.exe", arg);
2. cmd.waitForStarted возвращает bool, нахрена его с NULL сравнивать?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
updaite
Гость
« Ответ #8 : Август 13, 2014, 14:23 »

1. cmd.start("c:/path/to/hlds.exe", arg);
2. cmd.waitForStarted возвращает bool, нахрена его с NULL сравнивать?
1) А вот и не запускается он так cmd.start("c:/path/to/hlds.exe", arg); "говорит отсутствует содержимое, которое должно быть рядом с ним (файлы папки)", запуск только из корня или через .bat файл.
2)
Код:
    if (!cmd.waitForStarted())
    {
        return;
    }
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Август 13, 2014, 14:27 »

И куда оно это говорит?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
updaite
Гость
« Ответ #10 : Август 13, 2014, 14:31 »

И куда оно это говорит?
При запуске дает ошибку старта в  textEdit и сразу завершается.
« Последнее редактирование: Август 13, 2014, 14:33 от updaite » Записан
updaite
Гость
« Ответ #11 : Август 13, 2014, 14:32 »

И куда оно это говорит?
При запуске дает ошибку старта в  textEdit и сразу завершается.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #12 : Август 13, 2014, 14:36 »

Попробуй QProcess::setWorkingDirectory
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
updaite
Гость
« Ответ #13 : Август 13, 2014, 14:48 »

Попробуй QProcess::setWorkingDirectory
Как использовать в моем случае "c:\123\hlds.exe"?
Не прокатило.
Код:
 cmd.setWorkingDirectory("c:/123/");
 cmd.start("hlds.exe", arg);

Команда не выводит результат, а она попросту не доходит до hlds потому что не происходит действие по заданной команде.
« Последнее редактирование: Август 13, 2014, 14:50 от updaite » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #14 : Август 13, 2014, 14:48 »

Минимальный компилябельный пример сюда приложи.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.207 секунд. Запросов: 23.