Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: updaite от Август 13, 2014, 11:00



Название: QProcess не работает write
Отправлено: 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 только начал осваивать.


Название: Re: QProcess не работает write
Отправлено: Пантер от Август 13, 2014, 11:43
В QProcess параметры передаются через QStringList. У тебя просто не происходит запуска.


Название: Re: QProcess не работает write
Отправлено: updaite от Август 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); //запускаем процесс

Даже если приложение запущено с ошибкой оно всё равно должно принимать команды, Ввод по прежнему не работает.


Название: Re: QProcess не работает write
Отправлено: Пантер от Август 13, 2014, 13:24
Список строк же.

Код
C++ (Qt)
arg << "-game" << "cstrike" <<  "+port" << "27015" << "+map" << "de_dust" << "-console";
 


Название: Re: QProcess не работает write
Отправлено: updaite от Август 13, 2014, 13:53
Список строк же.

Код
C++ (Qt)
arg << "-game" << "cstrike" <<  "+port" << "27015" << "+map" << "de_dust" << "-console";
 
Так запускалось без ошибок, но на команды по прежнему не реагирует, может быть поток ввода заблокирован? А то как то странно, приложение запустило консоль перехватывает вывод из него, а сама консоль просто открыта и пустая.


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


Название: Re: QProcess не работает write
Отправлено: updaite от Август 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());


Название: Re: QProcess не работает write
Отправлено: Пантер от Август 13, 2014, 14:13
1. cmd.start("c:/path/to/hlds.exe", arg);
2. cmd.waitForStarted возвращает bool, нахрена его с NULL сравнивать?


Название: Re: QProcess не работает write
Отправлено: updaite от Август 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;
    }


Название: Re: QProcess не работает write
Отправлено: Пантер от Август 13, 2014, 14:27
И куда оно это говорит?


Название: Re: QProcess не работает write
Отправлено: updaite от Август 13, 2014, 14:31
И куда оно это говорит?
При запуске дает ошибку старта в  textEdit и сразу завершается.


Название: Re: QProcess не работает write
Отправлено: updaite от Август 13, 2014, 14:32
И куда оно это говорит?
При запуске дает ошибку старта в  textEdit и сразу завершается.


Название: Re: QProcess не работает write
Отправлено: Пантер от Август 13, 2014, 14:36
Попробуй QProcess::setWorkingDirectory


Название: Re: QProcess не работает write
Отправлено: updaite от Август 13, 2014, 14:48
Попробуй QProcess::setWorkingDirectory
Как использовать в моем случае "c:\123\hlds.exe"?
Не прокатило.
Код:
 cmd.setWorkingDirectory("c:/123/");
 cmd.start("hlds.exe", arg);

Команда не выводит результат, а она попросту не доходит до hlds потому что не происходит действие по заданной команде.


Название: Re: QProcess не работает write
Отправлено: Пантер от Август 13, 2014, 14:48
Минимальный компилябельный пример сюда приложи.


Название: Re: QProcess не работает write
Отправлено: updaite от Август 13, 2014, 14:56
Минимальный компилябельный пример сюда приложи.
Приложил проект от Qt Creator, hlds.exe для теста перекрепить не могу, весит всё дело 200 метров, имеется в любом клиенте игры counter strike 1.6


Название: Re: QProcess не работает write
Отправлено: Пантер от Август 13, 2014, 14:58
CONFIG += console добавь в pro файл, тогда будет консольку запускать.


Название: Re: QProcess не работает write
Отправлено: updaite от Август 23, 2014, 17:00
CONFIG += console добавь в pro файл, тогда будет консольку запускать.

Прописал, проблема осталась, и она актуальна, подскажите ещё что нибудь а то я уже измучился.