关于_beginThreadEx函数的问题
最近在做一个异步下载的项目,关于线程的老是搞不定,郁闷死了,搞了2星期了。
我总共建立2个线程,一个主线程:m_hMainThread = (HANDLE)_beginthreadex(.....)
一个子线程:pObj->m_hSlaverThread = (HANDLE)_beginthreadex(....)
主线程在对话框的按钮处理函数里面创建,子线程在线程类里面创建
BOOL CPatchToolDlg::OnDownload()
{
//主线程
m_hMainThread = (HANDLE)_beginthreadex(NULL, 0, &CAsyncGetHttpFile::AsyncStartThread,
m_pAsyncThread, 0, &m_pAsyncThread->m_nMainThreadID);
//::WaitForSingleObject(m_hMainThread, INFINITE);
问题1:此处没办法用等待,一等待对话框就卡掉了,请问有什么好的方法吗?
}
unsigned CALLBACKCAsyncGetHttpFile::AsyncStartThread(LPVOID lpParameter)
{
//子线程
pObj->m_hSlaverThread = (HANDLE)_beginthreadex(NULL, 0, &AsyncDownloadThread,
pObj, 0, &pObj->m_nSlaverThreadID);
//等待子线程安全退出
::WaitForSingleObject(pObj->m_hSlaverThread, INFINITE);
//_endthreadex(pObj->m_nSlaverThreadID); //结束子线程
//关闭子线程句柄
::CloseHandle(pObj->m_hSlaverThread);
pObj->m_hSlaverThread = NULL;
return 0;
}
问题2:_beginthreadex这个一定要匹配_endthreadex吗,貌似,::CloseHandle(pObj->m_hMsgThread);pObj->m_hMsgThread = NULL;这样并没有把线程关掉吧,有的时候它还是照样在运行中,按钮多点几次就访问冲突
哪位大哥有遇到这种问题,或则有好的方法告诉我下,特别是那个主线程的,到底改怎么关它,用事件等待的,不行,它一等待对话框就卡住了。。。
还有关线程时候有什么注意的地方吗,我怎感觉线程老是有泄漏的样子
[解决办法]
1.你这里没有无限循环,根本不需要用__endthreadex,所谓的冲突是你同步还有界面响应没做好,我一般偷懒的方式就是线程结束前锁住按钮(变灰)。
2.看你这样子,信号量没设置,用CEvent设个信号量,线程结束前set,然后等这个量
3.MFC推荐AfxBeginThread
[解决办法]
线程执行完,PostMessage到界面,
界面线程里尽量不要用WaitForSingleObject
[解决办法]
老问题啦
互斥可以 信号量 也可以设置临界区 静态变量 static flag;来互斥
你可以设置3级线程 1级是界面主线程 2级是等待线程 3级是工作线程
WaitForSingleObject放在2级线程中 等待所有的3级线程
2级线程postmessage到1级界面主线程