目录

​1 实现功能​

​2  免费下载​

​3 参考资料​

​4 部分示例代码​


1 实现功能

参考如下文章写的QT多线程demo,并添加了可暂停和继续功能。

同时实现了一个线程类创建多个不同形参参数的线程实例方式,并测试sleep和空语句的影响。

2  免费下载

​ threadTest-OK.7z​

3 参考资料

​(300条消息) Qt学习之路---线程启动与关闭_hanzhaoqiao1436的博客​

​(299条消息) QT创建和关闭线程_红药噻的博客​

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;
}