Пытаюсь запустить в новом потоке батник, который в свою очередь запускает java. Проблема состоит в том, что при втором завершении дерева процессов программа вылетает в отладчик. Подскажите что не так.
serverthread.hC++ (Qt)
#ifndef SERVERTHREAD_H
#define SERVERTHREAD_H
#include <QThread>
class QProcess;
class ServerThread : public QThread
{
Q_OBJECT
public:
void run();
public slots:
void kill();
void output();
signals:
void updateOutput(QString msg);
private:
QProcess *process;
};
#endif // SERVERTHREAD_H
serverthread.cppC++ (Qt)
#include "serverthread.h"
#include "Windows.h"
#include <QProcess>
#include <QTextCodec>
#include <QDebug>
void ServerThread::run()
{
process = new QProcess(this);
process->setProcessChannelMode(QProcess::MergedChannels);
connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(output()));
process->setWorkingDirectory("E:\\server");
process->start("E:\\server\\server.bat");
exec();
}
void ServerThread::output(){
QByteArray bytes = process->readAllStandardOutput();
QTextCodec *codec = QTextCodec::codecForName("IBM 866");
QString string = codec->toUnicode(bytes);
emit updateOutput(string);
}
void ServerThread::kill(){
/*
* HACK: QProcess::kill() just kills the process. Under Windows, this is
* suboptimal because if the process was a batch file which spawned
* other processes, those processes will be orphaned. The best way is
* to kill the whole process tree manually. Under XP, there is an
* internal command called TASKKILL which handles this. To do this
* portably, we will have to iterate through the process list manually.
*/
#ifdef Q_WS_WIN
QString abort_cmd;
PROCESS_INFORMATION *pinfo = (PROCESS_INFORMATION *)process->pid();
abort_cmd = QString("taskkill /F /T /PID %1").arg(pinfo->dwProcessId);
QProcess pr;
pr.execute(abort_cmd);
qDebug()<<abort_cmd << pr.state();
#endif
}
и вызов по кнопке старта и кила
C++ (Qt)
ServerThread th;
connect(&th,SIGNAL(updateOutput(QString)),this,SLOT(setOutput(QString))); // вывод текста с потока
connect(pushButton_2,SIGNAL(clicked()),&th,SLOT(kill())); // сигнал кила, первый раз проходит а второй вызывает краш
th.run();