void run() override {
QString result;
/* ... here is the expensive or blocking operation ... */
emit resultReady(result);
signals:
void resultReady(const QString &s);
void MyObject::startWorkInAThread()
WorkerThread *workerThread = new WorkerThread(this);
connect(workerThread, &WorkerThread::resultReady, this, &MyObject::handleResults);
connect(workerThread, &WorkerThread::finished, workerThread, &QObject::deleteLater);
workerThread->start();
从官方的例子中可以看到,在run里面emit,但是,如果要在run里面进行如果要new一个QTimer,这样就要启动事件exec(),不然信号会发不出的,如下:
void TransformThread::run()
m_timeLine->start();
QTimer *t = new QTimer;
connect(t, SIGNAL(timeout()), this, SLOT(timeOutTest()));
t->start(100);
exec();
通过这样的代码就可以实现。
在QThread的构造函数中new()的对象,这个对象的创建在QThread被new的线程里面,
而在构造函数后面创建的对象,就在Thread中线程。
代码与实例
如下QThread代码
transformthread.h
#ifndef TRANSFORMTHREAD_H
#define TRANSFORMTHREAD_H
#include <QThread>
#include <QList>
QT_BEGIN_NAMESPACE
class QGraphicsItem;
class QTimeLine;
QT_END_NAMESPACE
class TransformThread : public QThread
Q_OBJECT
public:
TransformThread(QObject *object = nullptr);
~TransformThread();
void run();
void addListItem(QGraphicsItem *item);
void closeThread();
public slots:
void transformWay1(int value);
void transformFinished();
void timeOutTest();
private:
QList<QGraphicsItem*> m_list;
bool m_isRun;
QTimeLine *m_timeLine;
bool m_newTime;
#endif // TRANSFORMTHREAD_H
transformthread.cpp
#include "transformthread.h"
#include <QPointF>
#include <QTransform>
#include <QGraphicsItem>
#include <QPushButton>
#include <QTimeLine>
#include <QDebug>
#include <QTimer>
TransformThread::TransformThread(QObject *object):
QThread(object)
m_isRun = true;
m_newTime = true;
m_timeLine = nullptr;
TransformThread::~TransformThread()
delete m_timeLine;
void TransformThread::run()
while(m_isRun){
//qDebug() << "123456";
if(m_newTime){
m_timeLine = new QTimeLine(500);
m_timeLine->setFrameRange(0, 500);
qDebug() << "123";
connect(m_timeLine, SIGNAL(frameChanged(int)), this, SLOT(transformWay1(int)), Qt::DirectConnection);
connect(m_timeLine, SIGNAL(finished()), this, SLOT(transformFinished()), Qt::DirectConnection);
m_newTime = false;
m_timeLine->start();
//QTimer *t = new QTimer;
//connect(t, SIGNAL(timeout()), this, SLOT(timeOutTest()));
//t->start(100);
exec();
//QThread::sleep(1);
void TransformThread::addListItem(QGraphicsItem *item)
m_list << item;
void TransformThread::closeThread()
m_isRun = false;
void TransformThread::transformWay1(int value)
qDebug() << "value: " << value;
if(m_list.size() == 0)
return;
for(int i = 0; i < m_list.size(); i++){
QPointF pt = m_list[i]->boundingRect().center();
qreal angle = value / 2.0;
QTransform transform;
transform.translate(pt.x(), pt.y());
transform.rotate(angle, Qt::XAxis);
m_list[i]->setTransform(transform);
void TransformThread::transformFinished()
delete m_timeLine;
m_newTime = true;
void TransformThread::timeOutTest()
qDebug() << "11111111111111";
文章目录1. 引言2. QThread 文档3. QThread::run 和 QObject::connect4. QObject::moveToThread()5. 使用场景对于子类化 Thread 的方式对于 worker move to thread 的方式
1. 引言
你会用QThread吗?有几种使用方式?这几种使用方式都在何种场景下使用?有什么需要注意的地方吗?
2. QThr...
近日,使用QThread,一些问题百思不得其解,看过大牛的文章,恍然大悟啊。
原文 http://hi.baidu.com/dbzhang800/item/c14c97dd15318d17e1f46f41
在文章开始之前加注一点,为和我一样Qt水平不高的朋友提醒一下。QThread::wait(),一直以来我以为它阻塞的是QThread对象,可是我现在明白,原来阻塞的是这个对象所在的线程...
QThread类提供了一个与平台无关的管理线程的方法。一个QThread对象管理一个线程。QThread的执行从run()函数的执行开始,在Qt自带的QThread类中,run()函数通过调用exec()函数来启动事件循环机制,并且在线程内部处理Qt的事件。在Qt中建立线程的主要目的就是为了用线程来处理那些耗时的后台操作,从而让主界面能及时响应用户的请求操作。
QThread的...
3、start()函数启动线程,执行run函数
4、在run函数中设置标志位,通过标志位来return出run函数,(结束线程,自动发送finish()信号,通过这个信号可以响应一些信息))
阅读 8,643
NSThread简介
NSThread是苹果官方提供面向对象操作线程的技术,简单方便,可以直接操作线程对象,不过需要自己控制线程的生命周期。在平时使用很少,最常用到的无非就是 [NSThread currentThread]获取当前线程。
NSThread使用
1、 实例初始化、属性和实例方法
//创建线程
NSThread *newThread = [[N
#include "MainWindow.h"
#include "ui_MainWindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)