MFC开发,如何获取子线程的状态,确保子线程只有在挂起的状态下才会被激活?
2条回答 默认 最新
- 我不懂电脑 2015-01-30 04:01关注
不管是Windows API还是MFC的CWinThread类都没有给出直接获得线程状态的接口或函数。线程的状态分为正在执行、挂起、已经结束三种。利用API函数GetExitCodeThread()时获得的返回码只能判定线程是活着的还是已经结束了,这里“活着的”指的是正在执行或挂起状态。那么如果一个线程还活着,怎样鉴别一个线程是正在执行还是正在挂起呢???令人遗憾的是,微软没有给出直接的接口函数。
既然WindowsAPI和MFC都没给出直接返回线程状态的接口函数,还好MFC里有两个函数SuspendThread()和ResumeThread()。
微软给每个线程维护着一个叫做挂起次数计数器的东西,这个在上面两个函数中有大用处。SuspendThread()是使线程挂起,调用后,返回该次调用之前的挂起计数值,然后挂起计数值加1。如果返回为0,则表示线程原先正在执行,现在进入挂起状态。
而ResumeThread()是使线程唤醒,调用该函数后,线程此时并不一定能摆脱挂起状态。调用该函数后,返回该次调用之前的挂起计数值,然后挂起计数值减1,如果是原先挂起计数值已经为0则保持0值。如果返回值为1,则表示线程原先被挂起,现在转入正在执行状态。如果返回为0,则表示线程原先就处于正在执行状态,现在也继续执行。当返回值大于1时,挂起技术值减1,但线程将依旧被挂起,在这种情况下,只有继续调用几次该函数制止返回值为1,线程才能拜托挂起继续执行。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 用verilog实现tanh函数和softplus函数
- ¥15 Hadoop集群部署启动Hadoop时碰到问题
- ¥15 求京东批量付款能替代天诚
- ¥15 slaris 系统断电后,重新开机后一直自动重启
- ¥15 QTableWidget重绘程序崩溃
- ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
- ¥15 关于vue2中methods使用call修改this指向的问题
- ¥15 idea自动补全键位冲突
- ¥15 请教一下写代码,代码好难
- ¥15 iis10中如何阻止别人网站重定向到我的网站