【求助】MsgWaitForMultipleObjects 函数的问题
这个问题是来自我上一个提问的帖子 http://bbs.csdn.net/topics/390790125
上一个问题帖子的解决办法就是这个帖子的做法,但是又遇到新问题。。。
下面是我的代码, 然后再引出问题:
这是一个基于对话框的程序,
首先在头文件里面有几个变量的声明:
下面是CPP里面的代码
基于上面的代码,我第一次点Button1,那么就正常跑线程MyThread1,跑着跑着,我再点一次Button1,就会执行Button1下面if(runflag==1){…}里面的代码,然后线程MyThread1就自动退出了,可是现在的result=MsgWaitForMultipleObjects(1,m_CANSendThreadHandle,FALSE,INFINITE,QS_ALLINPUT); 返回的result 不会变为result == (WAIT_OBJECT_0) 也就是说,现在就进入死循环,一直在while (PeekMessage(&msg,NULL,0,0,PM_REMOVE))那里循环了,
问题:为什么他在线程结束后 MsgWaitForMultipleObjects不会返回WAIT_OBJECT_0 ?而且我是确定线程是退出了的,在debug窗口里面看到了 我最先以为是MsgWaitForMultipleObjects第二个参数的问题,因为本身线程的那个HANDLE (pCANThreads->m_hThread;)会在线程结束的时候消失,但是我这里是在AfxBeginThread过后就赋值给m_CANSendThreadHandle[0]这个数组了,MsgWaitForMultipleObjects里面参数也是m_CANSendThreadHandle啊,
现在最大的问题就是 为什么MsgWaitForMultipleObjects 检测不到线程退出的信号?
下面是我第二次点击Button1的DEBUG窗口截图;

上一个问题帖子的解决办法就是这个帖子的做法,但是又遇到新问题。。。
下面是我的代码, 然后再引出问题:
这是一个基于对话框的程序,
首先在头文件里面有几个变量的声明:
BOOL runflag; //这个为否正在发送数据的标志
int uiButton; //这个是表明哪一个函数启动的发送线程 的标志
HANDLE m_CANEvent;
HANDLE m_CANSendThreadHandle[3]; //这里定义3个handle 实际只用一个
CWinThread *pCANThreads; 下面是CPP里面的代码
BOOL CExample2Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
…
…
m_CANEvent=CreateEvent(NULL,FALSE,FALSE,NULL); //声明一个事件
runflag=0; //线程运行标志置0
return TRUE; // return TRUE unless you set the focus to a control
}
void CExample2Dlg::OnButton1() //这是一个按钮响应函数,用按钮开启线程的函数
{
DWORD result ;
MSG msg ;
if(runflag==1) //如果线程正在运行
{
SetEvent(m_CANEvent); //发出让线程结束
while(1)
{
result=MsgWaitForMultipleObjects(1,m_CANSendThreadHandle,FALSE,INFINITE,QS_ALLINPUT);
if (result == WAIT_OBJECT_0) //如果等到线程结束 就执行下面的break;
{
break;
}
else
{
while (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) //线程没有结束 就分发消息
{
TRACE("收到消息,函数返回值为%d /n",result);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
}
ResetEvent(m_CANEvent); //设置无信号,让线程进入等待超时的工作
uiButton=1; //标记这是按钮响应的函数启动的线程
pCANThreads=AfxBeginThread(MyThread1,this);
m_CANSendThreadHandle[0]=pCANThreads->m_hThread; //赋值handle
runflag=1;
Sleep(1000); //故意延迟1秒 让开启的线程跑一跑
}
UINT CExample2Dlg::MyThread1(void *param)
{
CExample2Dlg *Dlg=(CExample2Dlg *)param;
int i;
CString tmp;
DWORD dw;
//在进入下面循环前,在我那个真实程序前,还有不少Dlg->XXXX的工作,在线程里面操作主界面的一//些显示,读取数据等工作
for(i=0;i<100000;i++) //这里是我人为模拟 要让它循环这么多次,意为模拟发送这么多次
{
dw = WaitForSingleObject(Dlg->m_CANEvent,10); //让其延迟10ms就输出一个数
if( dw == WAIT_OBJECT_0 ) //收到结束线程信号
{
Dlg->runflag=0; //线程运行标志复位
return 0;
}
if( dw == WAIT_TIMEOUT) //延迟到了,就执行下面的显示数值
{
if(Dlg->uiButton == 1)
{
tmp.Format(" %d ",i);
Dlg->m_count.SetWindowText(tmp); //这个是让其在界面上面显示当前i的数值
} // Dlg->m_count是主界面上面的一个static控件
if(Dlg->uiButton ==2 )
{
tmp.Format(" %d ",i);
Dlg->m_count2.SetWindowText(tmp); //这个是让其在界面上面显示当前i的数值
} // Dlg->m_count是主界面上面的一个static控件
}
}
Dlg->runflag=0; //线程运行标志复位
return 0;
}
void CExample2Dlg::OnButton2() //停止线程的按钮
{
// TODO: Add your control notification handler code here
SetEvent(m_CANEvent);
}基于上面的代码,我第一次点Button1,那么就正常跑线程MyThread1,跑着跑着,我再点一次Button1,就会执行Button1下面if(runflag==1){…}里面的代码,然后线程MyThread1就自动退出了,可是现在的result=MsgWaitForMultipleObjects(1,m_CANSendThreadHandle,FALSE,INFINITE,QS_ALLINPUT); 返回的result 不会变为result == (WAIT_OBJECT_0) 也就是说,现在就进入死循环,一直在while (PeekMessage(&msg,NULL,0,0,PM_REMOVE))那里循环了,
问题:为什么他在线程结束后 MsgWaitForMultipleObjects不会返回WAIT_OBJECT_0 ?而且我是确定线程是退出了的,在debug窗口里面看到了 我最先以为是MsgWaitForMultipleObjects第二个参数的问题,因为本身线程的那个HANDLE (pCANThreads->m_hThread;)会在线程结束的时候消失,但是我这里是在AfxBeginThread过后就赋值给m_CANSendThreadHandle[0]这个数组了,MsgWaitForMultipleObjects里面参数也是m_CANSendThreadHandle啊,
现在最大的问题就是 为什么MsgWaitForMultipleObjects 检测不到线程退出的信号?
下面是我第二次点击Button1的DEBUG窗口截图;

...全文
相关推荐
MsgWaitForMultipleObjects函数的一种用法
工程是VS2010,具体描述了如何在主线程中用MsgWaitForMultipleObjects等待子线程结束的同时,处理子线程发送的界面消息。
定时函数的应用综述.pdf
。。。
定时函数的应用综述.docx
。。。
易语言超级延时模块
易语言超级延时模块源码 系统结构:超级延时,CreateWaitableTimerA,SetWaitableTimer,MsgWaitForMultipleObjects, ======程序集1 | | | |------ _启动子程序 | | | |------ 超级延时 | | | | ======调用的Dll | | | |---[dl
易语言按钮滑动效果
易语言按钮滑动效果源码系统结构:线程启动,优化池,SetWaitableTimer,CloseHandle,MsgWaitForMultipleObjects,CreateWaitableTimerA, ======窗口程序集1 || ||------__启动窗口_创建完毕 || ||------_图片框2_鼠标左键


