widget.h
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButtonstart_clicked();
void dealSignal();
void on_pushButtonclose_clicked();
void dealDes();
signals:
void startThread();//启动自定义线程的处理函数信号
private:
Ui::Widget *ui;
MyThread * myT;//自定义线程类
QThread *thread;//子线程
};
widget.cpp
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
myT = new MyThread;
thread = new QThread(this);//子线程中的
//把自定义线程加到子线程中
myT->moveToThread(thread);
qDebug()<< "head:"<<QThread::currentThread();
//处理自定义线程中发送的信号mySignal
connect(this, &Widget::startThread, myT,&MyThread::myTimer);
connect(myT,&MyThread::mysignal,this,&Widget::dealSignal);
//这里是处理在关闭窗口时,线程其实并没有结束
connect(this, &Widget::destroyed,this,&Widget::dealDes);
}
Widget::~Widget()
{
delete ui;
}
void Widget::dealDes()
{
on_pushButtonclose_clicked();
}
void Widget::dealSignal()
{
static int i=0;
i++;
ui->lcdNumber->display(i);
}
void Widget::on_pushButtonstart_clicked()
{
if(thread->isRunning() == true)
{
return;
}
//启动线程,但是没有启动线程处理函数,如果只有这个lcd数字不变
thread->start();//1
myT->setFlag(false);
//不能直接调用,会导致线程处理函数和子线程在同一个线程
//只能通过signal 和slot 的方式
emit startThread();//2
}
void Widget::on_pushButtonclose_clicked()
{
if(thread->isRunning() == false)
{
return;
}
myT->setFlag(true);
thread->quit();//这个函数在退出时把线程手头的任务做完,但是这个线程是个while无限循环,所以就需要在线程函数中设置一个标志位
thread->wait();
}
自定义线程类
mythread.h
在线程处理函数中不能对UI界面进行操作!!!
class MyThread : public QObject
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = nullptr);
void myTimer();//线程处理函数
void setFlag(bool flag=true);
signals:
//定义一个信号
void mysignal();
public slots:
private:
bool flag;
};
mythread.cpp
MyThread::MyThread(QObject *parent) : QObject(parent)
{
flag=false;
}
void MyThread::myTimer()
{
while(!flag)
{
QThread::sleep(1);
emit mysignal();
qDebug()<< "sub:"<<QThread::currentThread();
}
}
void MyThread::setFlag(bool f)
{
flag = f;
}
QT4的多线程处理思路