qt之线程

第一种创建:

mythread1.h:

#ifndef MYTHREAD_H
#define MYTHREAD_H
#include<QThread>
#include<QDebug>

class mythread:public QThread
{
public:
    mythread(const QString & s,QObject *parent=nullptr);
    void run();
    void working();
private:
    const QString &str;
};

#endif // MYTHREAD_H

mythread1.cpp:

#include "mythread.h"
#include<QDebug>
mythread::mythread(const QString & s,QObject *parent)
    :QThread (parent),str(s)
{

}
 void mythread::run()
 {
     working();
     //exec();
 }
 void  mythread::working()
 {
     for(int i=0;i<10;i++)
     {
         qDebug()<<str<<i<<QThread::currentThreadId()<<endl;
     }
 }

main.cpp:

#include "widget.h"
#include <QApplication>
#include "mythread.h"
#include<QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
mythread my("s1");
qDebug()<<"主线程在运行"<<endl;
my.start();
qDebug()<<"主线程在运行"<<endl;
qDebug()<<"主线程在运行"<<endl;
qDebug()<<"主线程在运行"<<endl;
qDebug()<<"主线程在运行"<<endl;
qDebug()<<"主线程在运行"<<endl;
qDebug()<<"主线程在运行"<<endl;
qDebug()<<"主线程在运行"<<endl;
qDebug()<<"主线程在运行"<<endl;
qDebug()<<my.wait()<<endl;
//Widget add;
//add.show();
//    return a.exec();
}

效果:

 

 

第二种创建:

,mythread2.h:

#ifndef MYTHREAD2_H
#define MYTHREAD2_H

#include <QObject>

class MyThread2 : public QObject
{
    Q_OBJECT
public:
    explicit MyThread2(const QString& s,QObject *parent = nullptr);

signals:

public slots:
    void working1();
    void working2();
private:
    QString str;
};

#endif // MYTHREAD2_H

mythread2.cpp:

#include "mythread2.h"
#include<QDebug>
#include<QThread>
MyThread2::MyThread2(const QString& s,QObject *parent)
    : QObject(parent),str(s){}
 void MyThread2::working1()
 {
     for(int i=0;i<10;i++)
     {
         qDebug()<<str<<i<<QThread::currentThreadId()<<"working1"<<endl;
     }
 }
 void MyThread2::working2()
 {
     for(int i=0;i<10;i++)
     {
         qDebug()<<str<<i<<QThread::currentThreadId()<<"working2"<<endl;
     }
 }

widget.h:

#ifndef WIDGET_H
#define WIDGET_H
#include<QThread>
#include <QWidget>
#include<QPushButton>
#include "mythread2.h"
class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
private:

    MyThread2 * mythread;
    QThread * ms;
};

#endif // WIDGET_H

widget.cpp:

#include "widget.h"
#include<QHBoxLayout>
#include<QThread>
#include<QObject>
#include<QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
     QHBoxLayout *s=new QHBoxLayout(this);
      QPushButton *s1=new QPushButton("确定");
      QPushButton *s2=new QPushButton("取消");
      s->addWidget(s1);
      s->addWidget(s2);
    mythread=new MyThread2("mythread is starting...");
    ms=new QThread(this);
    mythread->moveToThread(ms);
    ms->start();
    connect(s1,SIGNAL(clicked()),mythread,SLOT(working1()));
    connect(s2,SIGNAL(clicked()),mythread,SLOT(working2()));
   connect(ms,SIGNAL(finished()),mythread,SLOT(deleteLater()));
}

Widget::~Widget()
{
    qDebug()<<"~Widget()"<<endl;
    ms->quit();
    ms->wait();
}

main.cpp:

#include "widget.h"
#include <QApplication>
#include "mythread.h"
#include<QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//mythread my("s1");
//qDebug()<<"主线程在运行"<<endl;
//my.start();
//qDebug()<<"主线程在运行"<<endl;
//qDebug()<<"主线程在运行"<<endl;
//qDebug()<<"主线程在运行"<<endl;
//qDebug()<<"主线程在运行"<<endl;
//qDebug()<<"主线程在运行"<<endl;
//qDebug()<<"主线程在运行"<<endl;
//qDebug()<<"主线程在运行"<<endl;
//qDebug()<<"主线程在运行"<<endl;
//qDebug()<<my.wait()<<endl;
Widget add;
add.show();
    return a.exec();
}

效果:

 

 

 

posted @ 2020-07-09 23:58  sunshine_gzw  阅读(138)  评论(0编辑  收藏  举报