工作线程操作主界面控件引起死锁及解决
来源:互联网 发布:迅游网络助手礼包在哪 编辑:程序博客网 时间:2024/05/20 09:11
问题描述:
在监控程序中,设计一监控循环。
头文件 .h
HANDLE m_hEventExit;
CWinThread* m_pThread;
构造函数中,创建该事件
m_hEventExit=CreateEvent(NULL, // 安全
TRUE, // 手动
FALSE, // 初始化为非信号模式
_T("Exit Event") // 线程名称
);
在 OnButtonThreadStart() 中
{
if(!m_pThread)
{
ResetEvent(m_hEventExit);
m_ pThread = AfxBeginThread(MonitorThreadFunc, this);
}
}
MonitorThreadFunc 中需要修改主界面中的控件。
这时候如果在 OnButtonThreadStop ()中
{
SetEvent(m_hEventExit);
if(m_ pThread!= NULL)
{
TRACE0("The thread is still running.\n");
WaitForSingleObject(m_ pThread ->m_hThread, -1);
delete m_ pThread;
m_ pThread = NULL;
}
}
其中 Wait 行使主界面进入等待状态,如果这时候工作线程执行完了,可以顺利退出,如果线程此时正在更新界面控件,就会陷入死锁。
解决方法:
使用 WaitThreadWithHandleMsg 函数,可以在等待线程结束的同时响应消息。
为了使用方便,将该函数封装了一下,使用的时候只需要调用一下。
{
HRESULT hResult = S_FALSE;
BOOL bWait = TRUE;
while (bWait)
{
DWORD dwEvt = MsgWaitForMultipleObjects( 1 , & hEventThread,FALSE,INFINITE,QS_ALLINPUT);
switch (dwEvt)
{
case WAIT_OBJECT_0:
bWait = false ;
hResult = TRUE;
break ;
case WAIT_OBJECT_0 + 1 :
{
MSG msg;
while (::PeekMessage( & msg, NULL, 0 , 0 , PM_NOREMOVE))
{
if (WM_CLOSE == msg.message || WM_QUIT == msg.message)
{
bWait = false ;
break ;
}
else
{
PeekMessage( & msg, NULL, 0 , 0 , PM_REMOVE);
TranslateMessage( & msg);
DispatchMessage( & msg);
}
}
break ;
}
default : // WAIT_TIMEOUT WAIT_FAILED
bWait = false ;
hResult = FALSE;
break ;
}
} // end while
return hResult;
}
- 工作线程操作主界面控件引起死锁及解决
- 工作线程操作主界面控件引起死锁及解决
- 工作线程操作主界面控件引起死锁及解决
- <iOS>关于子线程和block中操作主线程界面的控件讨论
- C# 线程 委托 回调-操作主线程定义的控件
- C#子线程操作主线程中的控件
- C# 子线程操作主窗体控件的解决方法
- C# 子线程操作主窗体控件的解决方法
- 在子线程中操作主线程
- Wireshark使用操作主界面英汉对照
- C#中子线程操作主线程中窗体上控件的方法
- C# 在自定义线程中采用系统委托方式操作主窗体线程控件的方法
- C#中子线程操作主线程中窗体上控件的方法
- C#中子线程操作主线程中窗体上控件的方法
- C#中子线程操作主线程中窗体上控件的方法
- 在C#中子线程如何操作主线程中窗体上控件
- C#中子线程操作主线程中窗体上控件的方法
- C#新线程中操作主线程的控件 ,解…
- Windows平台下Cocos2d-x 打包Android平台APK
- Access denied for user错误
- Android 上传图片到JavaWeb服务器
- 导出压缩包
- 你必须记住的30个CSS选择器[译]
- 工作线程操作主界面控件引起死锁及解决
- LeetCode 42. Trapping Rain Water(装雨水)
- CORS(跨域资源共享) 的配置
- 正则表达式小括号的多义性
- lca倍增算法学习记录
- jquery的选择器
- 课程练习三-1004-problem D
- char与int数据类型转换
- Android Studio 快捷键 for Mac OS X