[gelöst] Multithreading, GUI-Zugriff auf Hauptthread

Alles rund um die Programmierung mit Qt
Antworten
Josh
Beiträge: 6
Registriert: 29. April 2014 14:22

[gelöst] Multithreading, GUI-Zugriff auf Hauptthread

Beitrag von Josh »

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

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);
};
mainwindow.cpp

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();
}
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!
Zuletzt geändert von Josh am 21. April 2015 10:01, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Multithreading, GUI-Zugriff auf Hauptthread

Beitrag von Christian81 »

Und was genau funktioniert jetzt nicht?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Josh
Beiträge: 6
Registriert: 29. April 2014 14:22

Re: Multithreading, GUI-Zugriff auf Hauptthread

Beitrag von Josh »

Hallo,

er verweigert es, weil er immernoch sagte, er würde auf den Mainthread mit der GUI nicht zugreifen können, da ich viel rumprobiert hatte, hab ich aber auch allerhand andere Meldungen gesehen *g*

Jedenfalls habe ich mir nochmal einen Demo-Prototypen gebastelt und meinen Fehler gefunden. Das Ganze funktioniert jetzt also letztlich wunderbar :).
connect(worker, SIGNAL(output(QString input)), this, SLOT(writeConsole(QString input)));
man nehme also rot markiertes weg, also
connect(worker, SIGNAL(output(QString)), this, SLOT(writeConsole(QString)));
Variablennamen waren der Fehler, letztlich irgendwie doch eine Basissache.

LG
Antworten