[gelöst] Multithreading, GUI-Zugriff auf Hauptthread
Verfasst: 20. April 2015 13:26
Hallo,
leider hab ich dieses Problem trotz langen Suchen und Try&Error nicht lösen können, hier erstmal ein paar Code-Snippets:
mainwindow.h
mainwindow.cpp
Ich möchte also aus einem 2. Thread, in welchen Executables (Konsolenprogramme) abgefertigt werden den derzeitigen Stand und die Debug-Ausgabe an den Mainthread übergeben, der Mainthread soll diese weiterverarbeiten und ist weiterhin frei nutzbar. Ich komme aus der C#-Umgebung und habe mit Invokes bereits gearbeitet, bei QT und den Signal-Slot-Prinzip finde ich leider nicht, was ich falsch mache, habe auch schon etliches probiert. Wie kann man also diese (wahrscheinlich recht einfache) Aufgabe lösen?
Bin für jede Anregung dankbar!
leider hab ich dieses Problem trotz langen Suchen und Try&Error nicht lösen können, hier erstmal ein paar Code-Snippets:
mainwindow.h
Code: Alles auswählen
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
Ui::MainWindow *ui;
public slots:
void writeConsole(QString input);
void setProgress(int progress);
}
class Worker : public QObject {
Q_OBJECT
public:
Worker();
~Worker();
public slots:
void process();
signals:
void finished();
QString output(QString input);
void setProgress(int progress);
void error(QString err);
};Code: Alles auswählen
void MainWindow::on_btn_execute_clicked()
{
ui->btn_execute->setEnabled(false);
ui->progressBar->setValue(0);
ui->consoleoutput->clear();
QThread* thread = new QThread;
Worker* worker = new Worker();
worker->moveToThread(thread);
connect(thread, SIGNAL(started()), worker, SLOT(process()));
connect(worker, SIGNAL(finished()), thread, SLOT(quit()));
connect(worker, SIGNAL(output(QString input)), this, SLOT(writeConsole(QString input)));
connect(worker, SIGNAL(setProgress(int progress)), this, SLOT(setProgress(int progress)));
connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
}
void MainWindow::writeConsole(QString input)
{
ui->consoleoutput->appendPlainText(input);
}
void MainWindow::setProgress(int progress)
{
ui->progressBar->setValue(progress);
}
Worker::Worker() {
}
Worker::~Worker() {
}
void Worker::process() {
emit setProgress(100*(i+1)/taskmax); //Stand zur ProgressBar im Mainthread übergeben
currentTime = QTime::currentTime();
emit output(currentTime.toString("hh:mm:ss") + " Task number "+QString::number(i+1)+"\n"); //eine Konsolenausgabe tätigen
emit output("=== Tasks completed, ready for new work ===\n");
emit finished();
}Bin für jede Anregung dankbar!