1.QThread 使用
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QObject>
#include <QThread>
class MyThread : public QThread
{
Q
_OBJECT
public:
explicit MyThread(QObject *parent = nullptr);
void run() override;
void setFlag(bool run_flag);
signals:
void sig_updateNum(int num);
private:
bool run_flag;
};
#endif // MYTHREAD_H
#include "MyThread.h"
#include <QDebug>
MyThread::MyThread(QObject *parent) : QThread(parent)
{
}
void MyThread::run()
{
while(run_flag){
static int num = 0;
++num;
QThread::msleep(100);
qDebug() << Q_FUNC_INFO << QThread::currentThreadId();
emit sig_updateNum(num);
}
}
void MyThread::setFlag(bool run_flag)
{
this->run_flag = run_flag;
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setWindowTitle(QStringLiteral("test"));
initThread();
qDebug() << Q_FUNC_INFO << QThread::currentThreadId();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::initThread()
{
myThread = new MyThread();
connect(myThread, &MyThread::sig_updateNum, this, [&](int num){
ui->lineEdit_id->setText(QString::number(num));
});
}
void MainWindow::on_pushButton_stop_clicked()
{
myThread->setFlag(false);
}
void MainWindow::on_pushButton_clicked()
{
myThread->start();
}
2.QMutex 使用-线程间通讯-共享资源
#ifndef WRITETHREAD_H
#define WRITETHREAD_H
#include <QObject>
#include <QThread>
#include <QMutex>
struct SHARE_MSG{
char msg[128];
};
class WriteThread : public QThread
{
Q_OBJECT
public:
explicit WriteThread(QMutex* m_mutex, SHARE_MSG* m_msg, QObject *parent = nullptr);
void run() override;
signals:
private:
QMutex *m_mutex;
SHARE_MSG* m_msg;
};
#endif // WRITETHREAD_H
#include "WriteThread.h"
#include <QDebug>
WriteThread::WriteThread(QMutex *m_mutex, SHARE_MSG *m_msg, QObject *parent)
{
this->m_mutex = m_mutex;
this->m_msg = m_msg;
}
void WriteThread::run()
{
while(1){
m_mutex->lock();
static char ch = 'a';
for(int i = 0; i < 128; i++){
if(i == 127) {
m_msg->msg[i] = '\0';
continue;
}
m_msg->msg[i] = ch;
QThread::msleep(50);
}
qDebug() << "WRITE" << m_msg->msg;
m_mutex->unlock();
QThread::msleep(1000);
ch++;
}
}
#ifndef READTHREAD_H
#define READTHREAD_H
#include <QObject>
#include <QThread>
#include <QMutex>
#include "WriteThread.h"
class ReadThread : public QThread
{
Q_OBJECT
public:
explicit ReadThread(QMutex* m_mutex, SHARE_MSG* m_msg, QObject *parent = nullptr);
void run() override;
private:
QMutex* m_mutex;
SHARE_MSG* m_msg;
};
#endif // READTHREAD_H
#include "ReadThread.h"
#include <QDebug>
ReadThread::ReadThread(QMutex *m_mutex, SHARE_MSG *m_msg, QObject *parent):QThread(parent)
{
this->m_msg = m_msg;
this->m_mutex = m_mutex;
}
void ReadThread::run()
{
while(1){
m_mutex->lock();
qDebug() << "READ" << m_msg->msg;
m_mutex->unlock();
QThread::msleep(800);
}
}
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setWindowTitle(QStringLiteral("test"));
SHARE_MSG* msg = new SHARE_MSG;
QMutex* mutex = new QMutex();
ReadThread* readThread = new ReadThread(mutex,msg, this);
WriteThread* writeThread = new WriteThread(mutex, msg, this);
readThread->start();
writeThread->start();
}