落花生雪 2015-01-30 03:56 采纳率: 100%
浏览 1811
已采纳

如何获线程的状态???

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,线程才能拜托挂起继续执行。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 用verilog实现tanh函数和softplus函数
  • ¥15 Hadoop集群部署启动Hadoop时碰到问题
  • ¥15 求京东批量付款能替代天诚
  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 QTableWidget重绘程序崩溃
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站