在VC2010下!
在对话框类中有个按钮响应的函数void CmyDialog::OnBnClickedbtn1()
{
// TODO: 在此添加控件通知处理程序代码
m_pThread = AfxBeginThread(ComThread, this));
if (m_hKillThreadEvent != NULL)
ResetEvent(m_hKillThreadEvent);
else
m_hKillThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
}m_pThread是一个CWinThread的指针
在线程中如果等到线程结束的事件if( WAIT_OBJECT_0 == WaitForSingleObject(pTmyDlg->m_hKillThreadEvent, 0))
{
pmyDlg->m_bThreadAlive = FALSE;
AfxEndThread(0);
}m_bThreadAlive是对话框类的BOOL型的成员函数,代表现在线程是否运行的标志。
因担心在线程成未关闭的情况下,点击对话框的关闭按钮(右上角的红叉),所以在OnClose()处理中关闭线程void CTestDialog::OnClose()
{
// TODO: 在此添加消息处理程序代码和/
do
{
SetEvent(m_hKillThreadEvent);
Sleep(50);
}while(m_bThreadAlive);
m_pThread = NULL; if(NULL != m_hKillThreadEvent)
{
CloseHandle(m_hKillThreadEvent);
m_hKillThreadEvent = NULL;
}
CDialogEx::OnClose();}发现在点击关闭后,程序死在即,此事件发生没能执行杀死线程的代码do
{
SetEvent(m_hKillThreadEvent);
Sleep(50);
}while(m_bThreadAlive);
但是不再OnClose中处理,则正常执行,线程能够退出,我是在搞不懂了,这个到底是怎么回事??和对话框的退出有关系吗?
在对话框类中有个按钮响应的函数void CmyDialog::OnBnClickedbtn1()
{
// TODO: 在此添加控件通知处理程序代码
m_pThread = AfxBeginThread(ComThread, this));
if (m_hKillThreadEvent != NULL)
ResetEvent(m_hKillThreadEvent);
else
m_hKillThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
}m_pThread是一个CWinThread的指针
在线程中如果等到线程结束的事件if( WAIT_OBJECT_0 == WaitForSingleObject(pTmyDlg->m_hKillThreadEvent, 0))
{
pmyDlg->m_bThreadAlive = FALSE;
AfxEndThread(0);
}m_bThreadAlive是对话框类的BOOL型的成员函数,代表现在线程是否运行的标志。
因担心在线程成未关闭的情况下,点击对话框的关闭按钮(右上角的红叉),所以在OnClose()处理中关闭线程void CTestDialog::OnClose()
{
// TODO: 在此添加消息处理程序代码和/
do
{
SetEvent(m_hKillThreadEvent);
Sleep(50);
}while(m_bThreadAlive);
m_pThread = NULL; if(NULL != m_hKillThreadEvent)
{
CloseHandle(m_hKillThreadEvent);
m_hKillThreadEvent = NULL;
}
CDialogEx::OnClose();}发现在点击关闭后,程序死在即,此事件发生没能执行杀死线程的代码do
{
SetEvent(m_hKillThreadEvent);
Sleep(50);
}while(m_bThreadAlive);
但是不再OnClose中处理,则正常执行,线程能够退出,我是在搞不懂了,这个到底是怎么回事??和对话框的退出有关系吗?
解决方案 »
- MFC列表框控件字符顺序
- 一个C语言的小问题
- 做客户端的时候碰到的问题?高手们进来提供些解决建议,谢谢!
- CALLBACK函数与线程安全的问题
- 五一期间找VC高手兼职(在深圳)!
- (急)CoCreateInstance()函数调用
- 紧急求助:关于ATL工程生成的.mk文件!(急,在线等)
- 巨简单的一个CRecordset查询问题,能帮我解决者,我可以把我的分全给你,up者有分
- 为什么没有人会这样的问题?CWnd::GetDlgNextItem(CWnd* pchWnd,BOOL prview = FALSE);
- 如何写开机自启动并且躲过杀软防火墙
- MFC 删除了默认菜单 怎么还原
- MFC中几个控件如何自绘?
暂停程序,看看线程中处于什么执行状态, 可能线程中在等待其它事件, 而程序中等待标志, 导致程序死锁,可能在线程中 WaitForMultipleObjects, m_hKillThreadEvent 作为其中一个事件
比如都在GUI主线程2. 退出的时候为什么要用while循环?激活一下事件就可以了啊3. m_hKillThreadEvent的值必须相同,m_hKillThreadEvent必须在创建线程前初始化。
1)WaitForSingleObject()是在线程中等待的,不再同一个线程。
2)我要判断线程是否真的退出了!
3)m_hKillThreadEvent的值必须相同?什么意思懂!m_hKillThreadEvent创建线程前初始化,我已经这样修改了,但是和我说的一样的情况关闭不了线程!void CmyDialog::OnBnClickedbtn1()
{
// TODO: 在此添加控件通知处理程序代码
if (m_hKillThreadEvent != NULL)
ResetEvent(m_hKillThreadEvent);
else
m_hKillThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
m_pThread = AfxBeginThread(ComThread, this));
}
线程退出的时候,向对话框Post一条消息。在消息里处理真正退出后的清理
{
CTestDialog * pTestDlg = static_cast<CTestDialog * >(lparam);
pTestDlg->m_bThreadAlive = TRUE;// HANDLE pEvent = pTestDlg->m_hKillThreadEvent;
for (;;)
{
if( WAIT_OBJECT_0 == WaitForSingleObject(pTestDlg->m_hKillThreadEvent, 5))
{
pTestDlg->m_bThreadAlive = FALSE;
AfxEndThread(0);
return 0;
}
.............................. }//end for(;;) return 0;