记录一下Qt线程的创建,主要是方便以后复用代码
1 线程创建
/**********************************************************************************************
* ThreadRecvData.h
* 描述:本线程类主要功能实现从服务器接收数据.
* 作者:xhome
* 时间:2020/5/8
*********************************************************************************************/
#pragma once
#include <QThread>
class ThreadRecvData : public QThread {
Q_OBJECT
public:
explicit ThreadRecvData(QObject *parent = 0);
~ThreadRecvData();
void stop();
protected:
void run();
signals:
public slots:
private:
bool m_stopFlag;
};
/**********************************************************************************************
* ThreadRecvData.cpp
* 描述:本线程类主要功能实现从服务器接收数据.
* 作者:xhome
* 时间:2020/5/8
*********************************************************************************************/
#include "ThreadRecvData.h"
#include <QDebug>
ThreadRecvData::ThreadRecvData(QObject *parent) :QThread(parent)
{
m_stopFlag = false;
qDebug() << "ThreadRecvData ok.";
}
void ThreadRecvData::run()
{
while (!m_stopFlag)
{
QThread::sleep(1);
qDebug() << "ThreadRecvData +++++++++++";
}
}
ThreadRecvData::~ThreadRecvData()
{
}
void ThreadRecvData::stop()
{
m_stopFlag = true;
}
线程调用及销毁
mThreadRecvData = new ThreadRecvData(this);
mThreadRecvData->start();
mThreadRecvData->stop(); //结束线程.
线程阻塞唤醒
#ifndef PTHREADDEVCMD_H
#define PTHREADDEVCMD_H
#include <QObject>
#include <QThread>
#include <QHostAddress>
#include <QUdpSocket>
#include <QHostInfo>
#include <errlog.h>
#include <QWaitCondition>
#include <QMutex>
// add by xhome 2019/3/6
//设备命令下发线程
class pthreadDevCmd : public QThread
{
Q_OBJECT
public:
explicit pthreadDevCmd(QObject *parent = 0);
~pthreadDevCmd();
void run();
void stop();
signals:
void errMsg(QString);
public slots:
//接收ui主程发射来的设备命令信号
void recvDevCmdSlot();
private:
bool m_stopFlag;
QWaitCondition devCmdWaitCond;
QMutex mutex;
};
#endif // PTHREADDEVCMD_H
#include "pthreaddevcmd.h"
pthreadDevCmd::pthreadDevCmd(QObject *parent) : QThread(parent)
{
m_stopFlag = false;
}
pthreadDevCmd::~pthreadDevCmd()
{
}
void pthreadDevCmd::run()
{
QUdpSocket udpServerSocket;
qDebug() <<"pthreadDevCmd start ok!";
if(false == udpServerSocket.bind(QHostAddress::LocalHost, 10002, QUdpSocket::ShareAddress|QUdpSocket::ReuseAddressHint))
{
mDebug << "Failed to bind.";
// emit errMsg("Failed to bind");
}
else
{
qDebug() << "pthreadDevCmd bind ok.";
}
while(!m_stopFlag)
{
mutex.lock();
devCmdWaitCond.wait(&mutex);
mutex.unlock();
qDebug() << "devCmdWait test.";
//分析传递来的cmd指令,依据不同的指令,向特定的装备上,传递命令消息.
}
}
void pthreadDevCmd::stop()
{
m_stopFlag = true;
}
//接收ui主程发射来的设备命令信号
void pthreadDevCmd::recvDevCmdSlot()
{
qDebug() << "recv dev cmd from ui.";
devCmdWaitCond.wakeOne();
}