先展示效果
点击不同的暂停按钮会将当前的线程进入等待,然后其他两个线程会加快自己当前现成的运行速度,点开始会重新执行当前的线程。(但是这个内容中有个问题,自己懒没有修复,就是当点击了某一个暂停按钮后,不能再继续点击)
先看一下总文件的形式
我们先看mythread.h中这个头文件的内容
#include
#include
#include
#include
#ifndef MYTHREAD_H
#define MYTHREAD_H
class Mythread :public QThread
{
Q_OBJECT
public:
Mythread();
void run(); //run函数,这个就是多线程的线程函数
int i=3;
// QQueue q;
signals:
void send_output_text(QString); //这个用作给UI界面发消息显示用的
void pauseSingnal();
private slots:
// void thread_start(); //线程启动槽函数,接收到主线程的启动信号,就会触发
// void thread_exit(); //线程结束槽函数,接收到主线程的结束信号,就会触发
// void thread_start_1();
// void thread_exit_1();
// void thread_exit_2();
// void thread_start_2();
void thread_pause(); //按钮判断的值
void thread_resume();
private:
bool pause_flag;
};
#endif // MYTHREAD_H
在展示一下mythread.cpp的代码段
#include "mythread.h"
Mythread::Mythread():pause_flag(false)
{
q.enqueue(3);
}
void Mythread::run() //多线程执行函数
{
int n=0;
while(true)
{
while(pause_flag){
msleep(10);
}
emit send_output_text(QString::number(n));
n++;
// msleep(10*q.last()*q.last());
msleep(10*i*i*i);
qDebug()<
widget.h:
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
#include
#include
#include
#include "mythread.h"
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
int i=3;
Mythread t;
signals:
void send_thread_start(); //发出启动信号
void send_thread_exit(); //发出结束信号
void send_thread_exit_1();
void send_thread_start_1();
void send_thread_exit_2();
void send_thread_start_2();
private slots:
void append_text(QString); //文本框添加文本槽函数
void append_text_1(QString);
void append_text_2(QString);
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
void on_pushButton_4_clicked();
void on_pushButton_5_clicked();
void on_pushButton_6_clicked();
void moveImg();
void moveImg_2();
void moveImg_3();
private:
Ui::Widget *ui;
Mythread *myth ; //实例化一个MYthread对象出来
Mythread *myth_2;
Mythread *myth_3;
void add(int id);
void sub(int id);
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
//#include "mythread.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
myth = new Mythread(); //实例化一个MYthread对象出来
myth_2=new Mythread();
myth_3=new Mythread();
connect(this, SIGNAL(send_thread_start()), myth, SLOT(thread_resume())); //线程重启
connect(this, SIGNAL(send_thread_exit()), myth, SLOT(thread_pause())); //线程暂停
connect(myth, SIGNAL(send_output_text(QString)), this, SLOT(append_text(QString))); //文本显示
connect(this, SIGNAL(send_thread_start_1()), myth_2, SLOT(thread_resume())); //线程启动
connect(this, SIGNAL(send_thread_exit_1()), myth_2, SLOT(thread_pause())); //线程终止
connect(myth_2, SIGNAL(send_output_text(QString)), this, SLOT(append_text_1(QString))); //文本显示
connect(this, SIGNAL(send_thread_start_2()), myth_3, SLOT(thread_resume())); //线程启动
connect(this, SIGNAL(send_thread_exit_2()), myth_3, SLOT(thread_pause())); //线程终止
connect(myth_3, SIGNAL(send_output_text(QString)), this, SLOT(append_text_2(QString))); //文本显示
myth->start();
myth_2->start();
myth_3->start();
// ui->label->setPixmap(QPixmap("b.png").scaled(ui->label->size(), Qt::IgnoreAspectRatio));
// ui->label_2->setPixmap(QPixmap("D:\qt\code\Thread\a.jpg").scaled(ui->label_2->size(),Qt::IgnoreAspectRatio));
// ui->label_3->setPixmap(QPixmap("D:\qt\code\Thread\a.jpg").scaled(ui->label_3->size(),Qt::IgnoreAspectRatio));
}
Widget::~Widget()
{
delete ui;
}
void Widget::append_text(QString str) //编辑框追加文本槽函数
{
ui->textEdit->setText(str);
moveImg();
}
void Widget::append_text_1(QString str)
{
ui->textEdit_2->setText(str);
moveImg_2();
}
void Widget::append_text_2(QString str){
ui->textEdit_3->setText(str);
moveImg_3();
}
void Widget::add(int id)
{
switch (id) {
case 1:
myth_2->i++;
myth_3->i++;
break;
case 2:
myth->i++;
myth_3->i++;
break;
case 3:
myth_2->i++;
myth->i++;
break;
default:
break;
}
}
void Widget::sub(int id)
{
switch (id) {
case 1:
myth_2->i--;
myth_3->i--;
break;
case 2:
myth->i--;
myth_3->i--;
break;
case 3:
myth_2->i--;
myth->i--;
break;
default:
break;
}
}
void Widget::on_pushButton_clicked()
{
add(1);
emit send_thread_start();
}
void Widget::on_pushButton_2_clicked()
{
sub(1);
emit send_thread_exit();
}
void Widget::on_pushButton_3_clicked()
{
add(2);
emit send_thread_start_1();
}
void Widget::on_pushButton_4_clicked()
{
// i_2=true;
sub(2);
emit send_thread_exit_1();
}
void Widget::on_pushButton_5_clicked()
{
add(3);
emit send_thread_start_2();
}
void Widget::on_pushButton_6_clicked()
{
// i_3=true;
sub(3);
emit send_thread_exit_2();
}
void Widget::moveImg()
{
QLabel *label = ui->label;
if(label->geometry().y()>=((QWidget*)label->parent())->height())
label->setGeometry(QRect(QPoint(label->geometry().x(),0),label->size()));
label->setGeometry(QRect(QPoint(label->geometry().x(),label->geometry().y()+5),label->size()));
}
void Widget::moveImg_2()
{
QLabel *label = ui->label_2;
if(label->geometry().y()>=((QWidget*)label->parent())->height())
label->setGeometry(QRect(QPoint(label->geometry().x(),0),label->size()));
label->setGeometry(QRect(QPoint(label->geometry().x(),label->geometry().y()+5),label->size()));
}
void Widget::moveImg_3()
{
QLabel *label = ui->label_3;
if(label->geometry().y()>=((QWidget*)label->parent())->height())
label->setGeometry(QRect(QPoint(label->geometry().x(),0),label->size()));
label->setGeometry(QRect(QPoint(label->geometry().x(),label->geometry().y()+5),label->size()));
}
moveImg这几个函数就是定义图片的运行轨迹,如有不懂得函数自己去查。
不懂得可以联系我。