zoukankan      html  css  js  c++  java
  • mciSendString 多线程播放多首音乐 & 注意事项

    昨天晚上遇到一个问题:

    使用 mciSendString  控制播放多首音乐的时候,出现最后一次播放的音乐无法通过 mciSendString ("close mp3") 关闭音乐的播放。

    mciSendString  在多个线程中调用。

    到23点,问题依然没解决,只好先上床睡觉。

    今天早上,经过半个小时的研究,终于找到问题的原因。

    mciSendString  在多次的操作: open -> play -> pause -> resume -> close -> open -> play -> ... loop

    mciSendString 的所有操作必须在同一个线程中完成!

    昨天晚上遇到的问题就是因为 mciSendString 的不同操作在不同的线程中调用,导致在 A线程中的 play 在 B线程中无法通过 mciSendString("close ..") 关闭音乐的播放。

    但是在程序中,需要使用到多线程,这个时候的解决方案:

    先设置几个 command - id:

    enum {id_b_video_preivew_bgsound_play, id_b_video_preivew_bgsound_play_next, id_b_video_preivew_bgsound_pause, id_b_video_preivew_bgsound_resume, id_b_video_preivew_bgsound_close}

    在不同的线程中,不论 open, play, pause, resume,close, 全通过调用 SendMessage(..., WM_COMMAND...);  触发:

    SendMessage(hwnd_frame, WM_COMMAND, MAKEWPARAM(id_b_video_preivew_bgsound_open, 0), 0); //模拟发送 WM_COMMAND

    SendMessage(hwnd_frame, WM_COMMAND, MAKEWPARAM(id_b_video_preivew_bgsound_play, 0), 0); //模拟发送 WM_COMMAND

    SendMessage(hwnd_frame, WM_COMMAND, MAKEWPARAM(id_b_video_preivew_bgsound_close, 0), 0); //模拟发送 WM_COMMAND

    这样所有的 mciSendString  的动作都在一个线程中完成( 用户UI线程 )完成。

    这样之前的问题就不存在了。

  • 相关阅读:
    记一次小程序之旅
    基于supervisor秒级Laravel定时任务
    如何在Ubuntu16.04 中安装Linux, Nginx, MySQL, PHP (LEMP 栈)
    从CSV文件中读取jpg图片的URL地址并多线程批量下载
    关于PHP程序员解决问题的能力
    Laradock 快速搭建PHP开发环境
    array_map 等php回调函数使用问题(关联数组下标获取)
    Laravel-Action 对代码的改造
    Sessions共享技术设计
    scrapy 写文件进行debug调试
  • 原文地址:https://www.cnblogs.com/personnel/p/7721737.html
Copyright © 2011-2022 走看看