几个全局变量在主线程与子线程被访问问题//

mirroatl199 2013-01-29 10:49:32

volatile HWND hMCI = NULL;
volatile int slen = 0;
volatile int spos = 0;
CMenu mutex;//有必要加个线程同步????
//三个全局变量

UINT WINAPI MyThreadProc(LPVOID pParam)
{
mutex.Lock();
hMCI = MCIWndCreate(NULL,NULL,WS_POPUP|MCIWNDF_NOPLAYBAR|MCIWNDF_NOMENU,NULL);
MCIWndOpen(hMCI,"res//back.mp3",0);
slen = MCIWndGetLength(hMCI);
if(hMCI)
MCIWndPlay(hMCI);
mutex.unLock();
return 1;
}

void CMainFrame::OnManageUser()
{
if(ShowObj.ShowWindow(SW_SHOW))
{
//菜单的单击消息,启动线程
AfxBeginThread((AFX_THREADPROC)MyThreadProc,GetSafeHwnd());
}
}

SetTimer(1,150,NULL);//CMainFrame的OnCreate函数里

void CMainFrame::OnTimer(UINT_PTR nIDEvent)
{
mutex.Lock();
spos = MCIWndGetLength(hMCI);//用定时器来判断,是否播放完毕,播放完毕再次启动线程
if(spos == slen && spos != 0)
{
AfxBeginThread((AFX_THREADPROC)MyThreadProc,GetSafeHwnd());
spos = 0;
}
mutex.unLock();
CFrameWnd::OnTimer(nIDEvent);
}
调试hMCI 句柄值是相同的,但是,不知为啥spos的值是0 不变化。
...全文
203 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mirroatl199 2013-01-31
  • 打赏
  • 举报
回复
啊 我试试 我本来放在对话框初始化里的。但是,这样主窗口弹出时,不能最大化。
引用 7 楼 jason_wentzel 的回复:
volatile HWND hMCI = NULL; volatile int slen = 0; volatile int spos = 0; CMenu mutex;//有必要加个线程同步???? //三个全局变量 UINT WINAPI MyThreadProc(LPVOID pParam) { mutex.Lock(); if(hMCI) ……
西山小月 2013-01-30
  • 打赏
  • 举报
回复
每次线程执行完不是把spos赋值为0了吗,那结果不就是0吗
肆水東澤 2013-01-30
  • 打赏
  • 举报
回复
启动线程后,试试KillTimer
孤客天涯 2013-01-30
  • 打赏
  • 举报
回复
volatile HWND hMCI = NULL; volatile int slen = 0; volatile int spos = 0; CMenu mutex;//有必要加个线程同步???? //三个全局变量 UINT WINAPI MyThreadProc(LPVOID pParam) { mutex.Lock(); if(hMCI) MCIWndPlay(hMCI); mutex.unLock(); return 1; } void CMainFrame::OnManageUser() { if(hMCI == NULL) { hMCI = MCIWndCreate(NULL,NULL,WS_POPUP|MCIWNDF_NOPLAYBAR|MCIWNDF_NOMENU,NULL); MCIWndOpen(hMCI,"res//back.mp3",0); slen = MCIWndGetLength(hMCI); SetTimer(1,150,NULL); } if(ShowObj.ShowWindow(SW_SHOW)) { //菜单的单击消息,启动线程 AfxBeginThread((AFX_THREADPROC)MyThreadProc,GetSafeHwnd()); } } void CMainFrame::OnTimer(UINT_PTR nIDEvent) { mutex.Lock(); if(hMCI != NULL) { spos = MCIWndGetLength(hMCI);//用定时器来判断,是否播放完毕,播放完毕再次启动线程 if(spos == slen && spos != 0) { AfxBeginThread((AFX_THREADPROC)MyThreadProc,GetSafeHwnd()); spos = 0; } } mutex.unLock(); CFrameWnd::OnTimer(nIDEvent); } 还有,楼主一定要把播放放线程中处理?这里感觉意义不大,因为MCIWndPlay(hMCI);本来就是异步执行的
mirroatl199 2013-01-30
  • 打赏
  • 举报
回复
求解决办法啊
引用 5 楼 jason_wentzel 的回复:
首先,你逻辑有些问题:我不知道你OnManageUser()什么时候调用,我想应该是菜单或是点某个按钮才会调用,而你SetTimer(1,150,NULL);//CMainFrame的OnCreate函数里,也就是说定时器在你MCIWndCreate之前就会启动,此时在定时器中spos = MCIWndGetLength(hMCI);这里的hMCI还未创建。 其次,就算是逻辑改好了,还有一个可能……
孤客天涯 2013-01-30
  • 打赏
  • 举报
回复
首先,你逻辑有些问题:我不知道你OnManageUser()什么时候调用,我想应该是菜单或是点某个按钮才会调用,而你SetTimer(1,150,NULL);//CMainFrame的OnCreate函数里,也就是说定时器在你MCIWndCreate之前就会启动,此时在定时器中spos = MCIWndGetLength(hMCI);这里的hMCI还未创建。 其次,就算是逻辑改好了,还有一个可能的原因:hMCI = MCIWndCreate,这个句柄你是在子线程创建的,而MCIWndGetLength(hMCI);是在定时器中,也就是在主线程中,这样就是跨线程访问hMIC,是有问题的。
ChinaTek 2013-01-30
  • 打赏
  • 举报
回复
围观一下! 学习一下!
傻X 2013-01-30
  • 打赏
  • 举报
回复
楼主你的意思是: OnManageUser()运行完之后,断点在f(spos == slen && spos != 0)这时还是为0么?
小新蜡笔 2013-01-30
  • 打赏
  • 举报
回复

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧