首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于_beginThreadEx函数的有关问题

2012-02-11 
关于_beginThreadEx函数的问题最近在做一个异步下载的项目,关于线程的老是搞不定,郁闷死了,搞了2星期了。我

关于_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级界面主线程

热点排行