我现在的程序是这样的:
启动的时候,就生成多个相同功能的对话框,每个对话框都起一个线程,这个线程是扫描下面设备的数据的,扫描的过程是每发一条指令(通过snmp)给下面设备,然后就延时一段时间(200ms,这个延时是通过定时器来的)以便收取下面回送的消息,等待发送下一条指令,如此循环下去,直到程序退出。
代码如下(略写)扫描线程函数
UINT CDlgInfo::ScanThread( LPVOID pParam)
{
CDlgInfo *pDlg=(CDlgInfo *)pParam;
do
{
pDlg->SendSnmp();//发送snmp包
Sleep(1000);
}
while(pDlg->m_bPowerFlag==TRUE);//判断是否结束,这个变量定义为volatile,并且是CDlgInfo的一个成员变量 return 0;
}void CDlgInfo::SendSnmp()
{ int i;
//查询机架信息
SnmpQueryJijia();
         
         m_bReceived=FALSE;//收到返回数据标志位
         KillTimer(2);
         settimer(2,200,NULL);//延时等待         MSG message; //等待收取数据,如果还未收到,则等待,转发消息
while(m_bReceived==FALSE)
{
if(::PeekMessage(&message,NULL,0,0,PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
}
         
}定时函数:
void CDlgInfo::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default
switch (nIDEvent)
{
       case 2://
    KillTimer(2);
    m_bReceived=TRUE;
break;
    
}
CDialog::OnTimer(nIDEvent);
}
结束时
m_bPowerFlag=FALSE;//改变变量,线程结束
WaitForSingleObject(pScanThread->m_hThread,INFINITE);//等待线程结束
delete pScanThread;//删除线程
pScanThread=NULL;
问题就是:结束时,经常在WaitForSingleObject(pScanThread->m_hThread,INFINITE);这里死掉(不是每次都死掉,有时候能正常退出)我在论坛里查了一些资料,说是“主线程在消息处理里等待,而我自己的线程又是等待定时消息”,从而造成了主线程和我自己的线程死锁。
不知原因究竟是什么,我又该如何解决呢?

解决方案 »

  1.   

    结束时改用以下代码
    while (TRUE)
        {
            DWORD result ; 
            MSG msg ;         while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
            { 
                DispatchMessage(&msg); 
            }
            result = MsgWaitForMultipleObjects(1, &pScanThread->m_hThread, 
                     FALSE, INFINITE, QS_ALLINPUT); 
            if (result == (WAIT_OBJECT_0 + 1))
            {            continue;
            } 
            else 
            { 
                break;
            }
        }
      

  2.   

    程序应该是死在这一行上了
    while(m_bReceived==FALSE)//加上m_bReceived=TRUE;试试
    m_bPowerFlag=FALSE;//改变变量,线程结束
    WaitForSingleObject(pScanThread->m_hThread,INFINITE);//等待另将CDlgInfo*作为线程参数传递也是不好的做法.
      

  3.   

    谢谢goodboyws(深夜不眠者)但我照你的方法试过了,但是这样做的话就退出不了
      

  4.   

    谢谢 DentistryDoctor(雅克医生<改行做程序员了>) 照你的方法做了,效果不错,到现在为止,还没发现问题,但我有一点不明白的是,如果不加上m_bReceived=TRUE的话,难道这时候的定时器不起作用了(不把m_bReceived置为TRUE;),还是其他的原因呢?