Всем привет
Подскажите пожалуйста, что не так в коде ниже, и как можно сделать вывод процесса, запущенного в отдельном потоке в textEdit (как я понял, надо сначала передавать данные в основной поток)
Задача - запуск из GUI приложения процесса, в отдельном потоке и вывод полученной, в результате его выполнения, информации в textEdit.
mainwindow.cpp#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
ServerThread th;
th.start();
}
mainwindow.h#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtGui/QMainWindow>
#include <QProcess>
#include <QString>
#include "thread.h"
namespace Ui
{
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
private slots:
void on_pushButton_clicked();
};
#endif // MAINWINDOW_H
thread.cpp#include "thread.h"
#include "mainwindow.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->start("uname");
exec();
}
void ServerThread::output()
{
QByteArray bytes = process->readAllStandardOutput(); //как передать вывод из созданного потока в основной?
}
thread.h#ifndef THREAD_H
#define THREAD_H
#include <QThread>
class QProcess;
class ServerThread : public QThread
{
Q_OBJECT
public:
void run();
public slots:
void output();
signals:
private:
QProcess *process;
};
#endif // THREAD_H
На данный момент при попытке компиляции, программа вылетает. Если трассировать вручную, то отладчик пишет:
QObject: Cannot create children for a parent that is in a different thread.
(Parent is ServerThread(0xbfffd8c4), parent's thread is QThread(0x804f818), current thread is ServerThread(0xbfffd8c4)
QThread: Destroyed while thread is still running