Смотрю пример применения тредов Mandelbrot.
http://doc.qt.nokia.com/4.6/threads-mandelbrot.html
Написано:
class MandelbrotWidget : public QWidget
{
//...
private slots:
void updatePixmap(const QImage &image, double scaleFactor);
//...
}
class RenderThread : public QThread
{
//...
signals:
void renderedImage(const QImage &image, double scaleFactor);
protected:
void run();
//...
}
MandelbrotWidget::MandelbrotWidget(QWidget *parent)
: QWidget(parent)
{
//...
connect(&thread, SIGNAL(renderedImage(QImage,double)),
this, SLOT(updatePixmap(QImage,double)));
//...
}
void RenderThread::run()
{
QImage image(resultSize, QImage::Format_RGB32);
forever {
//...
emit renderedImage(image, scaleFactor);
//...
}
}
void MandelbrotWidget::updatePixmap(const QImage &image, double scaleFactor)
{
//...
pixmap = QPixmap::fromImage(image);
//...
}
Смущает что в сигнале/слоте передается указатель на локальную переменную image определенную в функции RenderThread::run(). Смущает потому что(на сколько я ничего не понимаю)при передаче сигнала между тредами не известно когда сигнал попадет в слот. Функция к тому времени может закончиться и локальной переменной придет кирдык. Я бы сделал image членом RenderThread чтоб она существовала пока существует объект. В данном случае все скорее будет работать чем нет, т.к. в RenderThread::run() все происходит внутри forever{}, но, кажется еще где то в примерах QT видел такую фигню. Это нормальна практика или проявление особенностей QT(e.g. reference count)?
Еще вопросы.
В этом примере в RenderThread::run() все происходит внутри forever{}. Правильно я понимаю что обработчик событий в этом треде не запущен ведь его запускает exec()?
А нафига треду обработчик событий синалы ведь будут работать по любому?
Как тред прибить по сигналу из другого треда?
Мда, короче ничего не понимаю, может почитать чего?