新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     >>计算机科学论坛<<     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 计算机科学论坛计算机技术与应用『 C/C++编程思想 』 → VC++中,AfxBeginThread开启的线程 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 4595 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: VC++中,AfxBeginThread开启的线程 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     葛靖青001 美女呀,离线,快来找我吧!水瓶座1984-2-14
      
      
      等级:大三(研究MFC有点眉目了!)
      文章:168
      积分:595
      门派:XML.ORG.CN
      注册:2010/11/2

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给葛靖青001发送一个短消息 把葛靖青001加入好友 查看葛靖青001的个人资料 搜索葛靖青001在『 C/C++编程思想 』的所有贴子 点击这里发送电邮给葛靖青001 引用回复这个贴子 回复这个贴子 查看葛靖青001的博客楼主
    发贴心情 VC++中,AfxBeginThread开启的线程

    【转自互联网】

    最近,由于论文的需求,要用到Windows下的多线程。考虑到界面用MFC写了,于是上网搜了下MFC下的多线程怎样搞,都说用AfxBeginThread来日比较好。哥向来比较浮躁,先搜搜有没相关代码,找到几个可用的,然后各种摘抄,于是乎将哥的播放器的几个线程搞成下面这段代码(摘要):

      UINT playThread(LPVOID pParam){  //播放线程,固定格式

      //......做变量声明,赋值等前期工作

      while(SomeCondition){       //播放线程的循环

      //......播放音乐,不解析

      }

      return 0;

      }

      void CPlayerDlg::OnBnClickedPlay(){   //播放按钮响应函数

      if(isThreadPause){   //判断是否暂停中

      isThreadPause=false;

      pPlayerThread->ResumeThread();//继续播放

      }

      else{

      OnBnClickedStop();

      pPlayerThread=AfxBeginThread(playWaveThread,NULL);  //开启播放线程

      }

      }

      void CPlayerDlg::OnBnClickedPause(){     //暂停响应函数

      if(!isThreadPause){

      PlayerThread->SuspendThread();     //挂起进程,相当于暂停播放

      isThreadPause=true;

      }

      }

      void CPlayerDlg::OnBnClickedStop(){    //终止响应函数

      if(pPlayThread){

      isThreadPause=false;

      TerminateThread(pPlayerThread->m_hThread,0);//强行终止线程,这里有问题,后面说

      }

      }

      其中播放线程playThread的声明是固定那种格式的,而且最好写成全局函数,方便,如果写成类成员函数的话又要加static,调用时又要加作用域的,十分蛋痛。写完后果断运行,yeah,能播放、暂停和停止,相当舒服,也没去理会细节的问题。

      直到今天,心血来潮地打开任务管理器,看看程序内存占用情况,发现了一个狠严重的问题:每当我停止一首歌,播放下一首时,内存就突然间往上跳。一开始以为是正常的内存创建和回收造成的浮动,但我继续不断地重复播放停止、播放停止,发现内存一直往上升。虽然每次都只是上升一点点,但明摆着的memory leak搁在那,还不搞它哥以后怎样出来混?

      好,果断google之,发现问题出在TerminateThread这个函数。这个TerminateThread结束线程用的是相当暴力的方法,据说连里面的局部变量都不释放。这就草了,马上寻找解决办法,有人回帖说用CreateEvent和WaitForSingleObject结合日之,解释没解释清楚,给出的sample code也是相当纠结和羞涩,而且楼下跟帖说这种方法有可能阻塞死锁之类的。果断放弃,看到另外一种方法,就是在停止的响应函数里用::PostThreadMessage(由于播放线程是全局函数,所以前面要加::)给播放线程发送停止消息,播放线程里加一个MSG的变量和while,每次里面调用PeekMessage来检查是否发来停止的消息,写了下,代码相当简练明了:

      #define WM_THREAD_STOP 0x0427   //自定义一个消息,也可以用系统定义的如WM_QUIT

      UINT playWaveThread(LPVOID pParam){

      //......做变量声明,赋值等前期工作

      while(SomeCondition){       //播放线程的循环

      MSG msg;   //增加一个MSG的变量msg来接收消息

      while(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){      //将消息队列里的消息逐个读入msg

      if(msg.message==WM_THREAD_STOP){     //如果收到终止消息则退出

      //TODO:放在堆里的变量要在这里手动清理

      return 0;      //线程正常返回,会释放局部变量等内存资源

      }

      else{

      DispatchMessage(&msg);//字面意思,不解释

      }

      }

      //......播放音乐,不解析

      }

      return 0;//正常播放结束,释放资源

      }

      void CPlayerDlg::OnBnClickedPlay(){……}//播放按钮响应函数,不变

      void CPlayerDlg::OnBnClickedPause(){……}//暂停响应函数,也不变

      void CPlayerDlg::OnBnClickedStop(){

      if(pPlayerThread){

      isThreadPause=false;

      //原来的TerminateThread不用,换成下面这个

      ::PostThreadMessage(pPlayerThread->m_nThreadID,WM_THREAD_STOP,0,0);

      }

      }

      写完,果断运行并打开任务管理器监测,诶!果然没有出现之前的内存一直在涨的现象,十分舒服,搞定收工!话说本人刚学多线程,代码写得相当的水,如果哪位大牛看到这处理方法还存在什么问题望不吝赐教,谢谢!


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    ---人之所以能,是相信能!!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2010/11/24 15:26:00
     
     GoogleAdSense水瓶座1984-2-14
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 点击这里发送电邮给Google AdSense 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/6 23:30:53

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    5,593.750ms