[Qt4/C++] Wątki - dostęp do głównego okna


(Spwmarluk) #1

Witam,

Mam problem z dostępem do głównego okna z poziomu wątku. Gdy funkcja jest uruchamiana w tym samym wątku działa ok, jeśli uruchomię ją w nowym wątku, tekst wysyłany do głównego okna nie jest odświeżany. Pojawia się dopiero po zaznaczeniu blokiem tekstu lub po wysłaniu kolejnej linii danych.

Co zmienić, żeby w przyszłości uniknąć podobnych problemów?

plainTextEdit generowany jest z mainwindow.ui

mainwindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H


#include 

#include 

#include 


namespace Ui

{

    class MainWindow;

    class myThread;

}


class myThread : public QThread

{

    Q_OBJECT


    public:

        virtual void run();

};


class MainWindow : public QMainWindow

{

    Q_OBJECT


public:

    MainWindow(QWidget *parent = 0);

    ~MainWindow();

    friend int funkcja(MainWindow* mw);


public slots:

    void pbStartClicked();


private:

    Ui::MainWindow *ui;

    myThread *myt;

};


#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"


MainWindow *cpmw;


MainWindow::MainWindow(QWidget *parent)

    : QMainWindow(parent), ui(new Ui::MainWindow)

{

    QTextCodec::setCodecForTr (QTextCodec::codecForName ("UTF-8"));

    ui->setupUi(this);

    myt = new myThread();

    cpmw = this;

}


MainWindow::~MainWindow()

{

    delete ui;

}


void myThread::run()

{

     funkcja(cpmw);

}


int funkcja(MainWindow* mw)

{

    mw->ui->plainTextEdit->appendPlainText("START");

    return 0;

}


void MainWindow::pbStartClicked()

{

	myt->start();

}

(Awes) #2

Zgadza się, bo tak nie można robić. Jeżeli chcesz z innego wątku dodawać jakieś teksty do appendPlainText, to utwórz sobie kolejkę (chronioną mutexem), do której dodawaj teksty w wątku. Do okna podłącz timer i w jego obsłudze przenoś teksty z kolejki do appendPlainText.