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线程 )完成。

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

  • 相关阅读:
    Opengl编程指南第三章:视图
    OpenGL编程指南第四章:颜色
    OpenGL编程指南第七章:显示列表
    推荐:字体、排版简明入门
    OpenGL编程指南第八章:绘制像素、位图、字体和图像
    推荐:字体、排版简明入门
    OpenGL编程指南第五章:光照
    转载一篇密码学基本介绍
    ARM_异常和中断学习笔记
    ARM指令学习笔记
  • 原文地址:https://www.cnblogs.com/personnel/p/7721737.html
Copyright © 2011-2022 走看看