QThread не работает хорошо - PullRequest
       1

QThread не работает хорошо

3 голосов
/ 26 января 2012

это субобъект QTread ... и конкретный это в главной нити ....

Ошибка выполнения следующим образом:

Ошибка ASSERT в QCoreApplication :: sendEvent: "Невозможно отправить события в объекты, принадлежащие другому потоку. Текущая тема 176f0a8. Получатель '' (типа 'MainWindow') создан в потоке 3976a0 ", файл C: \ ndk_buildrepos \ Qt-рабочий стол \ SRC \ corelib \ ядро ​​\ qcoreapplication.cpp, строка 405 Неверный параметр передан функции времени выполнения C. Недействительным параметр передан функции времени выполнения C.

class PaintThread : public QThread {

private:
    QWidget* parent;

public:
    ~PaintThread() {}

    PaintThread(QWidget* parent = 0) {
        this->parent = parent;
    }

    void run() {
        while (1) {
            this->msleep(5000);
            parent->repaint();
        }
        this->exec();
    }
};

это конструктор MainFrame:

MainWindow::MainWindow(QWidget *parent) :
QWidget(parent)
{
tankPoint = new QRect(50, 50, 30, 30);

this->show();

PaintThread * pt = new PaintThread(this);
pt->start();
}

следующее переопределение paintEvent для MainWindow

void paintEvent(QPaintEvent*) {
    QPainter  p(this);

    p.setPen(Qt::red);
    p.setBrush(Qt::red);
    p.drawEllipse(*tankPoint);

    tankPoint->setLeft(200);
}

Может кто-нибудь сказать мне, почему?

1 Ответ

3 голосов
/ 26 января 2012

Родитель (в данном случае ваше MainWindow) находится в другом потоке.Согласно документации Qt

Вы можете в любое время вручную отправлять события любому объекту в любом потоке, используя поточно-безопасную функцию QCoreApplication :: postEvent ().События будут автоматически отправляться циклом событий потока, в котором был создан объект.Фильтры событий поддерживаются во всех потоках, за исключением того, что объект мониторинга должен находиться в том же потоке, что и отслеживаемый объект.Аналогично, QCoreApplication :: sendEvent () (в отличие от postEvent ()) может использоваться только для отправки событий объектам, живущим в потоке, из которого вызывается функция .

.в качестве решения я бы предложил следующее:

  • Определить сигнал в вашем классе PaintThread
  • подключить этот сигнал к слоту paint () в подклассе QWidget
  • Emitэто в функции run ()
...