Qt线程的启动、暂停、继续、退出

1.启动

void run(){
    while (!thread->isInterruptionRequested()) {
	QMutexLocker lock(&m_mutex);

	// to do something

	msleep(200);
    }
}

采用isInterruptionRequested()方法控制线程是否停止,该方法只有qt5才具备;采用锁m_mutex来决定线程是否暂停。用一个while循环使子线程一直处于运行状态。

如果该线程上运行的任务应该停止,则返回true。可以通过requestinterrupt()请求中断。

此函数可用于使长时间运行的任务完全可中断。不检查或操作这个函数返回的值是安全的,但是建议在长时间运行的函数中定期这样做。注意不要过于频繁地调用它,以保持较低的开销。

2.暂停

void pause() 
{
    m_mutex.lock();
}

m_mutex.lock();语句用于获取锁,不一定会在调用pause方法的时候立即暂停线程,可能是稍后暂停线程,这主要取决于何时调用pause方法的线程取得该锁。取得该锁后,循环的子线程将因为得不到锁而处于暂停状态。

3.继续

void resume()
{
    m_mutex.unlock();
}

调用resume()方法的线程释放锁,循环中的子线程将因为获得锁而继续循环运行。

4.结束线程

void exitThread()
{
    thread->requestInterruption();

    thread->wait();

    delete thread;
}

//结束线程

//thread->quit();

//thread->wait();

//delete thread;

//调用quit方法结束事件循环,即退出了exec()这个死循环,这样,就可以执行run方法中的return方法了,退出run。调用wait();方法是为了确保子线程退出了,已防止在未完全停止子线程的情况下delete而引发crash。

调用requestInterruption方法去请求停止线程,requestInterruption的实现机制实际上是通过互斥锁+标识变量的方式来实现的,通过维护标示变量来指定线程是否运行,循环的子线程将通过isInterruptionRequested()方法判断是否接收到暂停请求,如果接收到,则退出循环,也就意味着线程结束了。但线程的结束并不是立刻进行的,可能是稍后发生的,如果在线程还未停止前调用了delete方法,会引发crash,所以,在delete之前加一句wait();这句话的意思是等待线程完全停止,然后再去delete。

QT中,可以通过QThread类来实现线程的控制。以下是一些示例代码: 1. 一键暂停: 在QThread类中提供了一个suspend()函数,可以将线程暂停执行。可以在主线程中定义一个标志位,当按下暂停按钮时将标志位设置为true,线程执行过程中不断检查标志位,如果标志位为true,则调用suspend()函数将线程暂停。示例代码如下: ```cpp // 主线程中定义标志位 bool isPaused = false; // 暂停按钮的槽函数 void MainWindow::onPauseButtonClicked() { isPaused = true; } // 线程执行函数中检查标志位并暂停 void MyThread::run() { while (true) { // 检查标志位 if (isPaused) { // 暂停线程 this->suspend(); } else { // 执行线程任务 // ... } } } ``` 2. 一键运行: 在QThread类中提供了一个resume()函数,可以将线程恢复执行。可以在主线程中定义一个标志位,当按下运行按钮时将标志位设置为false,线程执行过程中不断检查标志位,如果标志位为false,则调用resume()函数将线程恢复执行。示例代码如下: ```cpp // 主线程中定义标志位 bool isPaused = true; // 运行按钮的槽函数 void MainWindow::onRunButtonClicked() { isPaused = false; } // 线程执行函数中检查标志位并恢复执行 void MyThread::run() { while (true) { // 检查标志位 if (isPaused) { // 暂停线程 this->suspend(); } else { // 执行线程任务 // ... this->resume(); } } } ``` 3. 一键退出: 可以在主线程中定义一个标志位,当按下退出按钮时将标志位设置为true,线程执行过程中不断检查标志位,如果标志位为true,则调用exit()函数将线程退出。示例代码如下: ```cpp // 主线程中定义标志位 bool isStopped = false; // 退出按钮的槽函数 void MainWindow::onStopButtonClicked() { isStopped = true; } // 线程执行函数中检查标志位并退出 void MyThread::run() { while (!isStopped) { // 执行线程任务 // ... } // 退出线程 this->exit(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fyzy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值