- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
线程函数设计以与MsgWaitForMultipleObjects函数使用要点
HYPERLINK /lancidie/archive/2011/04/06/2006748.html 线程函数的设计以及MsgWaitForMultipleObjects函数的使用要点 ----- 转
使用多线程技术可以显著地提高程序性能,本文就讲讲在程序中如何使用工作线程,以及工作线程与主线程通讯的问题。
?
一?创建线程
使用MFC提供的全局函数AfxBeginThread()即可创建一个工作线程。线程函数的标准形式为?UINT?MyFunProc(LPVOID );此函数既可以是全局函数,也可以是类的静态成员函数。之所以必须是静态成员函数,是由于类的非静态成员函数,编译器在编译时会自动加上一个this指针参数,如果将函数设置为静态的成员函数,则可以消除this指针参数。如果想在线程函数中任意调用类的成员变量(此处指的是数据成员,而不是控件关联的成员变量),则可以将类的指针作为参数传递给线程函数,然后经由该指针,就可以调用类的成员变量了。
//线程函数,类的静态成员函数
UINT CThreadTest::TH_SetProgress(LPVOID lpVoid)
{
???????CThreadTest *pTest=(CThreadTest *)lpVoid;
???????pTest-SetProgress();
???????return 0;
}
//类的成员函数,此函数执行实际的线程函数操作,却可以自如的调用成员数据
void CThreadTest::SetProgress()
{
int nCount=0;
???????while (1)
???????{
??????????????m_progress.SetPos(nCount); //设置进度条进度
//this-SendMessage(WM_SETPROGRESSPOS,nCount,0);//也可用这种方式
??????????????nCount++;
??????????????if (g_exitThread)
??????????????{
?????????????????????return;
??????????????}
??????????????Sleep(200);
???????}
}
?
二?线程函数体的设计
有过多线程设计经验的人都有体会,多线程设计最重要的就是要处理好线程间的同步和通讯问题。如解决不好这个问题,会给程序带来潜藏的隐患。线程的同步可以利用临界区、事件、互斥体和信号量来实现,线程间的通讯可利用全局变量和发消息的形式实现。其中事件和临界区是使用得比较多的工具。请看下面的线程函数体:
UINT AnalyseProc(LPVOID???lVOID)
{
???????if(WAIT_OBJECT_0== WaitForSingleObject(m_eventStartAnalyse.m_hThread,INFINITE))
???????{
??????????????while (WAIT_OBJECT_0 == WaitForSingleObject(m_eventExitAnalyse.m_hThread,0))
??????????????{
?????????????????????DWORD dRet=WaitForSingleObject(m_eventPause.m_hThread,0);
?????????????????????if (dRet == WAIT_OBJECT_0)
?????????????????????{
????????????????????????????//暂停分析
????????????????????????????Sleep(10);
?????????????????????}
?????????????????????else if (dRet == WAIT_TIMEOUT)
?????????????????????{
????????????????????????????//继续分析
????????????????????????????//
?????????????????????}
??????????????}
???????}
???????return 0;
}
上面的线程函数用到了三个事件变量eventStartAnalyse、eventExitAnalyse和eventPause,分别用来控制线程函数的启动、退出以及暂停。再配以WaitForSingleObject函数,就可以自如的控制线程函数的执行,这是在线程函数体内应用事件变量的典型方式,也是推荐的方式。
无论是工作线程还是用户界面线程,都有消息队列,都可以接收
文档评论(0)