qt中Qthread线程的使用以及安全关闭 您所在的位置:网站首页 qthread线程退出后能如何再次运行 qt中Qthread线程的使用以及安全关闭

qt中Qthread线程的使用以及安全关闭

2024-06-25 15:23| 来源: 网络整理| 查看: 265

前言

以前第一次使用线程的时候总是无法实现自己想要的效果,且为解决线程安全关闭的问题,今天看到一位老师讲了关于线程的使用方法,理解虽然还不是特别深刻,但已初步总结出相关注意事项。

环境:

qt5.12.12windows操作系统

使用线程思路:

新建线程类,继承QThread重写run()方法,将复杂程序都写在run的实现中,并设置循环条件(记得有些资料说线程必须写循环)通过start()方法开启线程,通过requestInterruption()方法发出中断请求来跳出循环条件,跳出循环后该线程结束在线程类中设置信号槽,当线程结束时杀死线程在线程的析构函数中也要添加requestInterruption()中断请求,防止强制关闭窗口时线程不能安全关闭

先列举重要代码:(记得类要继承QThread)

AudioThread.h文件

void run() override;

AudioThread.cpp文件

//构造函数 AudioThread::AudioThread(QObject *parent) : QThread(parent) { // 当监听到线程结束时(finished),就调用deleteLater回收内存 connect(this,&AudioThread::finished,this,[=](){ this->deleteLater(); qDebug() .....自定义代码 while(!isInterruptionRequested()){//当没发出中断请求时,执行循环体 .....自定义代码 } .....自定义代码 }

开启线程:

AudioThread *audio_thread=new AudioThread(this); audio_thread->start();

关闭线程:

audio_thread->requestInterruption(); audio_thread->wait(); //等待线程结束才能执行下面代码 audio_thread=nullptr;

完整代码:(我这里是通过线程调用ffmpeg实现音频录制,看起来会有点复杂,可只关注重要代码,也不要盲目复制粘贴,运行之前需要先配置ffmpeg)

AudioThread.h文件

#ifndef AUDIOTHREAD_H #define AUDIOTHREAD_H #include #include class AudioThread : public QThread { Q_OBJECT public: explicit AudioThread(QObject *parent = nullptr); ~AudioThread(); private: void run() override; signals: }; #endif // AUDIOTHREAD_H

AudioThread.cpp文件

#include "audiothread.h" #include #include extern "C"{ // 设备相关API #include // 格式相关API #include // 工具相关API(比如错误处理) #include // 编码相关API #include } #ifdef Q_OS_WIN // PCM文件的文件名 #define FILENAME "E:/media/out.pcm" #else #define FILENAME "/Users/mj/Desktop/out.pcm" #endif AudioThread::AudioThread(QObject *parent) : QThread(parent) { // 当监听到线程结束时(finished),就调用deleteLater回收内存 connect(this,&AudioThread::finished,this,[=](){ this->deleteLater(); qDebug() char *FMT_NAME="dshow"; const AVInputFormat *localAv_find_input_format = av_find_input_format(FMT_NAME); if(!localAv_find_input_format){ qDebug() qDebug() //向文件中写 file.write((char *)pkt->data,pkt->size); qDebug() char errbuf[1024]; av_strerror(ret,errbuf,sizeof(errbuf)); qDebug() audio_thread=new AudioThread(this); audio_thread->start(); //防止强制关闭窗口,线程无法正常退出 connect(audio_thread,&AudioThread::finished,audio_thread,[=](){ ui->pushButton->setText("开始录制"); is_record=false; if(is_abnormal){ qDebug()


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有