自己定义了一个继承CWinThread的类,并为该线程类添加了一个自定义消息实现后台加载图片数据,当图片数据还没有加载完我就关闭了应用程序,在析构函数中我调用了以下代码来结束线程: if(m_lpThread)
{
HANDLE hThread = m_lpThread->m_hThread;
DWORD nThreadID = m_lpThread->m_nThreadID;
if(hThread)
{
::PostThreadMessage(nThreadID,WM_QUIT,0,0);
::WaitForSingleObject(hThread,INFINITE);//代码在这里阻塞
}
}但每次运行到WaitForSingleObject的时候总是阻塞,没能正常结束线程??我这样的写法有问题吗? 下面是我写的继承CWinThread的类的代码:
CMyThread::CMyThread() : CWinThread()
{
m_bAutoDelete = FALSE;
}
CMyThread::~CMyThread()
{
}BOOL CMyThread::InitInstance()
{
return TRUE;
}
int CMyThread::ExitInstance()
{
int res = CWinThread::ExitInstance();
Delete();
return res;
}
{
HANDLE hThread = m_lpThread->m_hThread;
DWORD nThreadID = m_lpThread->m_nThreadID;
if(hThread)
{
::PostThreadMessage(nThreadID,WM_QUIT,0,0);
::WaitForSingleObject(hThread,INFINITE);//代码在这里阻塞
}
}但每次运行到WaitForSingleObject的时候总是阻塞,没能正常结束线程??我这样的写法有问题吗? 下面是我写的继承CWinThread的类的代码:
CMyThread::CMyThread() : CWinThread()
{
m_bAutoDelete = FALSE;
}
CMyThread::~CMyThread()
{
}BOOL CMyThread::InitInstance()
{
return TRUE;
}
int CMyThread::ExitInstance()
{
int res = CWinThread::ExitInstance();
Delete();
return res;
}
解决方案 »
- 求vc 工具 满足 鼠标到一个函数处 出现函数说明和例子
- vc++获取照片的拍照时间?
- 关于MFC初始化悬浮框的问题
- CBitmapButton是OwnerDraw的,怎样使CBitmapButton的图片居中?
- 能不能把CImage赋给CImageList呢?
- 再提一问,关于MScomm控件: 在使用MScomm控件时,怎么判断,所选择的串口已被其它程序使用?谢谢!!
- 急!!高分求助好的项目做毕业设计.
- sdk编程中,MessageBox为何是非摸态的?如何改变它为摸态?
- IE4/5的临时文件的格式是什么样的?
- 该问题为啥在众多论坛中从没有人回答我!!!
- 我现在用vs2010 基于MFC做了一个应用程序,现在要改成服务程序,不知道怎么做,还望各位帮帮忙,指导一下,谢谢!!!
- 无尽的乱码~~帮看看
void LoadImg()
{
CString fullPath;
for (int i = 0; i < m_max; i++)
{
fullPath = m_vFiles.at(0);
Bitmap *temImg = new Bitmap(fullPath.AllocSysString());
m_saveImg.Add(temImg);//CPtrArray
}
}
当图片比较多的时候,这个函数还没执行完我就把程序关掉就会阻塞
int CMyThread::ExitInstance()
{
int res = CWinThread::ExitInstance();
Delete();
return res;
}
先看函数ExitInstance是否执行了
if(NULL == m_lpThread)
{
m_lpThread = AfxBeginThread(RUNTIME_CLASS(CNewWinThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL);
ASSERT(NULL != m_lpThread);
m_lpThread->m_bAutoDelete = FALSE;
m_lpThread->ResumeThread();
}
// 销毁UI线程
if((NULL != m_lpThread) && (NULL != m_lpThread->m_hThread))
{
m_lpThread->PostThreadMessage(WM_QUIT, 0, 0);
WaitForSingleObject(m_lpThread->m_hThread, INFINITE);
delete m_lpThread;
m_lpThread = NULL;
}
会有变化么?如果没有变化,还是自己再加个CEvent互斥下看看吧
晕喽!
界面线程操作主线程,造成死锁,无限等待!
用MsgWaitfor..来等待线程返回吧
我是在主线程析构函数中调用::PostThreadMessage(nThreadID,WM_QUIT,0,0);来告诉子界面线程退出,这样不算是界面线程操作主线程吧,第一个参数不是指明了子线程的id吗,难道说是因为我在消息中用传进去的this访问外部函数就变成了在主线程中执行?
HANDLE hThread = m_lpThread->m_hThread;
DWORD nThreadID = m_lpThread->m_nThreadID;
if(hThread)
{
::PostThreadMessage(nThreadID,WM_QUIT,0,0);
while (TRUE)
{
DWORD result ;
MSG msg ;
BOOL flag = FALSE;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{//防止主线程卡死
if(msg.message == WM_QUIT)
return; DispatchMessage(&msg);
} result = MsgWaitForMultipleObjects(1, &hThread, FALSE, INFINITE, QS_ALLINPUT);
if(result == WAIT_OBJECT_0)
{
break;
}
else
{
continue;
}
}
}