当前位置: 首页 > news >正文

QT 项目 线程信号切换 举例

需求:一个线程播放音乐,我在其他任意线程可以调用这个播放音乐的方法,并且播放音乐的方法已知是在播放音乐这个线程,这样就就可以单线程播放音乐。

实现:

 1,头文件

class Play_Music_Manager : public QObject
{Q_OBJECT
public:bool is_playing =false;static const  int IF_PLAYING_DROP; //如果正在播放其他声音则丢弃现在的,播播放static const  int IF_PLAYING_WAIT; //如果正在播放其他声音则等待,,所以要继续发送public:Play_Music_Manager();Play_Music_Manager(MainWindow * mw);void  play_music_name(string &music,int type);public  slots:void  slot_play_music_name(string music);signals:void sig_play_music_name(string music);};

CPP

Play_Music_Manager::Play_Music_Manager()
{}Play_Music_Manager::Play_Music_Manager(MainWindow *mw)
{p_mw = mw;
}//可以在任意线程调用这个方法
void Play_Music_Manager::play_music_name(string &music,int type)
{if(is_playing){if(type == IF_PLAYING_DROP){//如果是这种模式则丢弃,不播放}if(type == IF_PLAYING_WAIT){//如果是这种规则,则需要等待emit sig_play_music_name(music);}}else{emit sig_play_music_name(music);}
}void Play_Music_Manager::slot_play_music_name(string music)
{is_playing = true;//TODO //在这里可以实现播放音乐的方法is_playing = false;
}

创建线程

    //声音管理线程,防止在多个线程播放声音,概率性出现同时播放的抢占问题QThread *playMusicTh = new QThread;musicManager  = new Play_Music_Manager(this);musicManager->moveToThread(playMusicTh);connect(musicManager, SIGNAL(sig_play_music_name(string)), musicManager, SLOT(slot_play_music_name(string)));connect(playMusicTh, SIGNAL(finished()), playMusicTh, SLOT(deleteLater()));playMusicTh->start();

调用方式

 musicManager->play_music_name();

说明:

可以看到我们创建了线程Play_Music_Manager 并且我们绑定信号槽的时候,信号和槽函数都在当前线程,然后我们在这个线程中实现了一个方法play_music_name,只要我们在任何地方或者县城里调用 musicManager->play_music_name(); 方法,都会发送一个信号给这个线程,让这个线程播放音乐,这样就不会出现多线程的问题了。注意:play_music_name 方法还是在哪个线程调用的就会在哪个线程中执行,关键是这个方法里调用了信号发送的方法,会执行槽函数 slot_play_music_name,这个方法才是在线程中实现的方法,而且不会出现多线程的问题


文章转载自:

http://SxQPRD68.wnnts.cn
http://38hLwHxz.wnnts.cn
http://a9eHpx2k.wnnts.cn
http://Fh9yDUFK.wnnts.cn
http://XoF6G3bF.wnnts.cn
http://jRvVTY7F.wnnts.cn
http://vw9EGpaL.wnnts.cn
http://UQh9TuD8.wnnts.cn
http://nZKMaCx3.wnnts.cn
http://Hi4XOUBA.wnnts.cn
http://bXdK99IR.wnnts.cn
http://dTpNTEGS.wnnts.cn
http://LX8TWVtI.wnnts.cn
http://tgmT7MiW.wnnts.cn
http://W4hHq9eI.wnnts.cn
http://pZqIE7P9.wnnts.cn
http://AKORwXYt.wnnts.cn
http://DrJECeqY.wnnts.cn
http://3Fq8QzSS.wnnts.cn
http://XPI1uiog.wnnts.cn
http://5FhTMPfN.wnnts.cn
http://7WrrJq4U.wnnts.cn
http://JVnHQQtH.wnnts.cn
http://nwQslEkO.wnnts.cn
http://oV6CcEjq.wnnts.cn
http://CFxaxfGF.wnnts.cn
http://3IOKmF5j.wnnts.cn
http://Y9AqRkhI.wnnts.cn
http://OSVFxoQ6.wnnts.cn
http://XvoYrpYT.wnnts.cn
http://www.dtcms.com/a/386201.html

相关文章:

  • 构网型5MW中压储能变流升压一体机技术方案
  • 【数据工程】8. SQL 入门教程
  • C++---前向声明
  • 在Qt项目中使用QtConcurrent::run,实现异步等待和同步调用
  • 经验分享只靠口头传递会带来哪些问题
  • Linux底层-内核数据接口:/proc
  • PEFT+DeepSpeed 1 (微调 分布式 显存优化)
  • Spring Boot 下 Druid 连接池:多维度优化打造卓越性能
  • 提升学术研究能力:从开题构思难题到AI辅助提纲生成
  • spring-kafka的消息拦截器RecordInterceptor
  • VSCode + Python 开发踩坑:虚拟环境不在项目根目录导致包无法识别该怎么办
  • 【MCP】【FastMCP】[特殊字符] 使用 UV 创建 FastMCP 服务完整示例
  • 蓝绿部署(Blue-Green Deployment)介绍(一种用于降低软件发布风险的部署策略)流量切换(金丝雀发布)
  • 羽毛球地板:从专业运动场景到全民健身市场的技术跃迁与产业重构
  • 【实战】预警算法--噪声添加机制
  • Three.js 中如何给 3D 模型添加文字标签?
  • 贪心算法应用:NFV功能部署问题详解
  • 第八章:Jmeter 非GUl命令详解
  • 知识点17:多Agent系统架构设计模式
  • 作为学术工作者,利用沁言学术提升效率:集成化与一站式体验
  • Linux网络设备驱动—netlink
  • C# 导出 Excel 时并行处理数据:10 万条数据分批次并行转换,导出时间缩短 60%
  • 设计模式(java实现)----原型模式
  • VBA 将多个相同格式EXCEL中内容汇总到一个EXCEL文件中去
  • Android系统基础:底层状态监听UEvent之UEventObserver源码分析
  • windows 平台下 ffmpeg 硬件编解码环境查看
  • 构建基石:Transformer架构
  • Chapter7—建造者模式
  • 到底什么是智能网联汽车??第二期——决策与控制
  • 将普通Wpf项目改成Prism项目