@[TOC](QT线程的使用 moveToThread() 二)
1.对于上一个问题的解决
1.线程
线程使用stop后,线程是开启状态,我们只是修改了bRun变量,才使循环停止的,线程并没有被关闭。
如果使用了
tThread.quit();
tThread.wait();
函数之后,线程确实关闭,但是新线程指针也就被删除,重新点击开启,就不能可以重新开启,但是connect并没有重新连接。不能重新运行start内的代码块。
2.看一下效果
按钮1
1 “newthread.cpp -> on_moveNewThread threadid:[8592]”
按钮二
2 “newthread.cpp -> on_moveNewThread threadid:[8608]”
确实是退出了线程 并且开始了新的线程
3.代码
3.1 mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QThread>
#include <QDebug>
#include "newthread.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
QThread thread;
void setNewThread(int i);
signals:
void signal_moveNewThread(int i);
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
3.2 mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
extern NewThread *newT;
MainWindow *mainWin;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
mainWin = this;
newT = new NewThread();
}
MainWindow::~MainWindow()
{
delete ui;
}
/**
* @brief MainWindow::setNewThread
* @param i 随便给个变量
* 设置新的线程
*/
void MainWindow::setNewThread(int i)
{
int count = 0;
//如果线程是运行的 就关闭线程 线程内的循环变量重新赋值
if(thread.isRunning())
{
thread.quit();
newT->canRun = 0;
}
//打印等待信息
while(!newT->runOver)
{
count ++;
qDebug() << "wait last thead over." << count;
}
//重新初始化新的变量
newT = new NewThread();
newT->canRun = 1; //重新赋值
newT->moveToThread(&thread); //加入线程
connect(this,SIGNAL(signal_moveNewThread(int)),newT,SLOT(on_moveNewThread(int))); //槽函数重新连接
emit signal_moveNewThread(i) ; //发送信号
thread.start(); //启动线程
}
/**
* @brief MainWindow::on_pushButton_clicked
* 按钮1
*/
void MainWindow::on_pushButton_clicked()
{
setNewThread(1);
}
/**
* @brief MainWindow::on_pushButton_2_clicked
* 按钮2
*/
void MainWindow::on_pushButton_2_clicked()
{
setNewThread(2);
}
3.3 NewThread.h
#ifndef NEWTHREAD_H
#define NEWTHREAD_H
#include <QObject>
#include <synchapi.h>
#include "mainwindow.h"
class NewThread : public QObject
{
Q_OBJECT
public:
explicit NewThread(QObject *parent = 0);
int canRun; //是否允许运行
int runOver; //运行是否结束
signals:
public slots:
void on_moveNewThread(int i);
};
#endif // NEWTHREAD_H
3.4 NewThread.cpp
#include "newthread.h"
NewThread *newT;
NewThread::NewThread(QObject *parent) : QObject(parent)
{
canRun = 1;
runOver = 1;
}
/**
* @brief NewThread::on_moveNewThread
* @param i
* 开启新的线程
*/
void NewThread::on_moveNewThread(int i)
{
QString msg = QString("%1 -> %2 threadid:[%3]")
.arg(__FILE__)
.arg(__FUNCTION__)
.arg((int)QThread::currentThreadId());
runOver = 0; //运行没结束
while (canRun) //循环打印
{
qDebug() << i << msg;
Sleep(1000); //1s打印一次
}
runOver = 1; //运行结束
}
以上代码都有注释 如果不明白的 可以留言讨论.
4.谢谢~~
新的线程知识
QT线程的使用 QtConcurrent