自己动手写QT多线程demo
Posted yantuguiguziPGJ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自己动手写QT多线程demo相关的知识,希望对你有一定的参考价值。
目录
1 实现功能
参考如下文章写的QT多线程demo,并添加了可暂停和继续功能。
同时实现了一个线程类创建多个不同形参参数的线程实例方式,并测试sleep和空语句的影响。
2 免费下载
3 参考资料
(300条消息) Qt学习之路---线程启动与关闭_hanzhaoqiao1436的博客-CSDN博客_qt线程退出释放
(299条消息) QT创建和关闭线程_红药噻的博客-CSDN博客
4 部分示例代码
//threadtest.cpp
#include "threadtest.h"
ThreadTest::ThreadTest(int dev):m_dev(dev)
{
a_toStop = false;
m_bRun1 = false;
m_bRun2 = false;
m_bRun3 = false;
m_bRun4 = false;
}
void ThreadTest::doWork()
{
QString msg = QString("%1 -> %2 threadid:[%3]")
.arg(__FILE__)
.arg(__FUNCTION__)
.arg((int)currentThreadId());
qDebug() << msg;
}
void ThreadTest::run()
{
QString msg = QString("%1 -> %2 threadid:[%3]")
.arg(__FILE__)
.arg(__FUNCTION__)
.arg((int)currentThreadId());
qDebug() << msg;
doWork();
//循环内语句不能为空,否则,暂停后,不能复原
// for(;;)
// {
QThread::sleep(1);//这里必须设置,才可以暂停后继续
qDebug() << "isRuning ";//这里必须设置,才可以暂停后继续
// qDebug() << "m_bRun: "<<m_bRun;//这里必须设置,才可以暂停后继续
{
// QMutexLocker lockera(&m_Mutex);//可有可无
// if(m_bRun == false)
// testWhileFun();
}
// }
while(1)
{
// sleep(1);//这里必须设置,才可以暂停后继续
// qDebug() << "isRuning ";//这里必须设置,才可以暂停后继续
// QMutexLocker lockera(&m_Mutex);//这里必须设置,才可以暂停后继续
switch(m_dev)
{
case 1:
while(1)
{
// QMutexLocker lockera(&m_Mutex1);//可有可无
if(!m_bRun1)
{
qDebug() << "doWork1:"/* << i*/;
// sleep(1);
}
}
break;
case 2:
while(1)
{
// QMutexLocker lockera(&m_Mutex1);//可有可无
if(!m_bRun2)
{
qDebug() << "doWork2:"/* << i*/;
// sleep(1);
}
}
break;
case 3:
while(1)
{
// QMutexLocker lockera(&m_Mutex1);//可有可无
if(!m_bRun3)
{
qDebug() << "doWork3:"/* << i*/;
// sleep(1);
}
}
break;
case 4:
while(1)
{
// QMutexLocker lockera(&m_Mutex1);//可有可无
if(!m_bRun4)
{
qDebug() << "doWork4:"/* << i*/;
// sleep(1);
}
}
break;
}
}
// while(!m_bRun)//一次设置后,退出,由while决定的
// {
// qDebug("thread A run");
QThread::sleep(2);
// }
}
void ThreadTest::testWhileFun()
{
// while(!a_toStop)// m_bRun
// {
qDebug("thread A run");
QThread::sleep(2);
// }
}
void ThreadTest::stopA(void)
{
QString msg = QString("%1 -> %2 threadid:[%3]")
.arg(__FILE__)
.arg(__FUNCTION__)
.arg((int)QThread::currentThreadId());
qDebug() << msg;
// QMutexLocker lockera(&a_stopMutex);
// a_toStop = true;
// QMutexLocker locker(&m_Mutex);
switch(m_dev)
{
case 1:
m_bRun1 = true;
break;
case 2:
m_bRun2 = true;
break;
case 3:
m_bRun3 = true;
break;
case 4:
m_bRun4 = true;
break;
}
}
void ThreadTest::startA(void)
{
QString msg = QString("%1 -> %2 threadid:[%3]")
.arg(__FILE__)
.arg(__FUNCTION__)
.arg((int)QThread::currentThreadId());
qDebug() << msg;
// QMutexLocker lockera(&a_stopMutex);
// a_toStop = false;
// QMutexLocker locker(&m_Mutex);
switch(m_dev)
{
case 1:
m_bRun1 = false;
break;
case 2:
m_bRun2 = false;
break;
case 3:
m_bRun3 = false;
break;
case 4:
m_bRun4 = false;
break;
}
}
//movetothreadtest.cpp
#include "movetothreadtest.h"
MoveToThreadTest::MoveToThreadTest()
{
m_bRun = false;
a_toStop = false;
}
void MoveToThreadTest::doWork()
{
QString msg = QString("%1 -> %2 threadid:[%3]")
.arg(__FILE__)
.arg(__FUNCTION__)
.arg((int)QThread::currentThreadId());
qDebug() << msg;
}
void MoveToThreadTest::start()
{
QString msg = QString("%1 -> %2 threadid:[%3]")
.arg(__FILE__)
.arg(__FUNCTION__)
.arg((int)QThread::currentThreadId());
qDebug() << msg;
doWork();
// for(;;)
// {
// QThread::sleep(1);
qDebug() << "isRuning ";
// {
// QMutexLocker locker(&m_Mutex);
// if(m_bRun == false)
// testWhileFun();
// // if(m_bRun == false)
// // break;
// }
// }
// while(1)
// {
// testWhileFun();
// }
while(!m_bRun)
{
qDebug("thread A run");
QThread::sleep(2);
}
}
void MoveToThreadTest::testWhileFun()
{
qDebug("thread A run");
QThread::sleep(2);
}
void MoveToThreadTest::stop()
{
QString msg = QString("%1 -> %2 threadid:[%3]")
.arg(__FILE__)
.arg(__FUNCTION__)
.arg((int)QThread::currentThreadId());
qDebug() << msg;
QMutexLocker locker(&m_Mutex);
m_bRun = true;
}
void MoveToThreadTest::stopA(void)
{
QString msg = QString("%1 -> %2 threadid:[%3]")
.arg(__FILE__)
.arg(__FUNCTION__)
.arg((int)QThread::currentThreadId());
qDebug() << msg;
// QMutexLocker lockera(&a_stopMutex);
// a_toStop = true;
QMutexLocker locker(&m_Mutex);
m_bRun = true;
}
void MoveToThreadTest::startA(void)
{
// QMutexLocker lockera(&a_stopMutex);
// a_toStop = false;
QString msg = QString("%1 -> %2 threadid:[%3]")
.arg(__FILE__)
.arg(__FUNCTION__)
.arg((int)QThread::currentThreadId());
qDebug() << msg;
QMutexLocker locker(&m_Mutex);
m_bRun = false;
}
以上是关于自己动手写QT多线程demo的主要内容,如果未能解决你的问题,请参考以下文章