线程使用方法之run

来源:互联网 发布:碳青霉烯 知乎 编辑:程序博客网 时间:2024/06/04 23:39

thread.h

#ifndef THREAD_H#define THREAD_H#include <QThread>class Thread : public QThread{    Q_OBJECTpublic:    explicit Thread();protected:    void run();signals:    void sendCloseFlag(int);};#endif // THREAD_H

thread.cpp

#include "thread.h"#include <QDebug>#include <QWidget>Thread::Thread(){}void Thread::run(){    qDebug() << "thread run: " << thread()->currentThreadId();//    QWidget *w = new QWidget;//ASSERT failure in QWidget: "Widgets must be created in the GUI thread.", file kernel\qwidget.cpp, line 1126    for(int i = 0; i < 5000; i++)//不打印信息,1亿次需要半秒不到,10亿次需要2秒    {        qDebug() << i << endl;    }    sendCloseFlag(1);}

widget.h

namespace Ui {class Widget;}class Widget : public QWidget{    Q_OBJECTpublic:    explicit Widget(QWidget *parent = 0);    ~Widget();private:    Ui::Widget *ui;private:    int closeFlag;public slots:    void setCloseFlag(int);};

widget.cpp

#include "widget.h"#include "ui_widget.h"#include <QDebug>Widget::Widget(QWidget *parent) :    QWidget(parent),    ui(new Ui::Widget){    ui->setupUi(this);    qDebug() << "widget thread: " << thread()->currentThreadId();    closeFlag = 0;}Widget::~Widget(){    qDebug() << "~Widget()";    delete ui;}void Widget::setCloseFlag(int flag){    closeFlag = flag;    close();}

main.cpp

#include "widget.h"#include <QApplication>#include <QDebug>#include "thread.h"int main(int argc, char *argv[]){    QApplication a(argc, argv);    qDebug() << "main thread: " << qApp->thread()->currentThreadId();    Widget w;    w.show();    Thread thread;    QObject::connect(&thread, SIGNAL(sendCloseFlag(int)), &w, SLOT(setCloseFlag(int)));    thread.start();    return a.exec();}

注意点:
1. 线程里面不能直接操作UI。
2. 只有线程的run方法才会进入新线程中,其他都是属于主线程。

原创粉丝点击