我现在的程序是这样的:
启动的时候,就生成多个相同功能的对话框,每个对话框都起一个线程,这个线程是扫描下面设备的数据的,扫描的过程是每发一条指令(通过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);这里死掉(不是每次都死掉,有时候能正常退出)我在论坛里查了一些资料,说是“主线程在消息处理里等待,而我自己的线程又是等待定时消息”,从而造成了主线程和我自己的线程死锁。
不知原因究竟是什么,我又该如何解决呢?
启动的时候,就生成多个相同功能的对话框,每个对话框都起一个线程,这个线程是扫描下面设备的数据的,扫描的过程是每发一条指令(通过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);这里死掉(不是每次都死掉,有时候能正常退出)我在论坛里查了一些资料,说是“主线程在消息处理里等待,而我自己的线程又是等待定时消息”,从而造成了主线程和我自己的线程死锁。
不知原因究竟是什么,我又该如何解决呢?
解决方案 »
- 【紧急求助】MFC编WINSOCK,第一次用就让出东西啊
- 为什么按钮不响应了?
- 定时器和类的问题,请各位帮忙!
- 关于OPENGL中实现倒影的问题!
- 我用Dev-C++编opengl程序,请问如何连接opengl32.lib、glu32.lib、glaux.lib,并且请告诉我这三个包在那有的下?谢谢!!
- 超级问题(在线等待)
- 急招多名VC程序员(广州)
- 摄像头拍照处理
- CBrush 在指定区域绘制位图,如何让位图固定??具体->
- 求助多线程
- 如何把一个字符串时间,转换成时间类型 SYSTEMTIME or CTime ?
- 急啊,如何在用vc来实现adobe的postscript type1字体的显示?
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;
}
}
while(m_bReceived==FALSE)//加上m_bReceived=TRUE;试试
m_bPowerFlag=FALSE;//改变变量,线程结束
WaitForSingleObject(pScanThread->m_hThread,INFINITE);//等待另将CDlgInfo*作为线程参数传递也是不好的做法.