пытаюсь разобраться с многопоточностью Qt\C++
объясните, пожалйста, почему вот этот мой код работает не так, как задумывалось:
phyThread.h
#include <QThread>
class phyThread : public QThread {
Q_OBJECT
public:
void run();
signals:
void count(int);
};
phyThread.cpp
#include "phyThread.h"
void phyThread::run() {
int i = 0;
while (i < 5) {
emit count(i);
i = i + 1;
sleep(1000);
}
}
phyView.h
#include <QtGui/QtGui>
#include "phyThread.h"
class phyView : public QGraphicsView {
Q_OBJECT
public:
phyView(QWidget *parent = 0);
~phyView();
protected:
QGraphicsTextItem *text;
phyThread *thread;
public slots:
void changeCount(int);
};
phyView.cpp
#include "phyView.h"
phyView::phyView(QWidget *parent) : QGraphicsView(parent) {
QGraphicsScene *scene = new QGraphicsScene(this);
scene->setSceneRect(0, 0, 640, 480);
setScene(scene);
text = new QGraphicsTextItem();
text->setPlainText("test");
scene->addItem(text);
thread = new phyThread();
thread->moveToThread(thread);
connect(thread, SIGNAL(count(int)), this, SLOT(changeCount(int)));
thread->start();
}
phyView::~phyView() {
}
void phyView::changeCount(int i) {
text->setPlainText(QString::number(i));
}
main.cpp
#include <QtGui/QApplication>
#include "phyView.h"
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
phyView w;
w.show();
return app.exec();
}
стоит добавить, что кучу материала по теме я уже прочитал;
понятно, что сигнально\слотовые соединения между потоками внутри превращаются в события;
понятно, что тип соединения Qt::DirectConnection ни к чему хорошему в данном случае не приведёт;
thread->moveToThread(thread) - подобное решение нашёл в постах '08-09 годов на различных форумах; необходимо для того, чтобы слоты выполнялись в контексте моего потока
пробовал запускать в потоке свой цикл обработки событий, это ничего не изменило, оно и понятно: в потоке без своего цикла сигналы будут эмитироваться, но слоты работать не будут;
в общем, на деле здесь я получаю text с установленной строкой 0, хотя ожидаю последовательную смену значения от 0 до 4 с интервалом в секунду