zoukankan      html  css  js  c++  java
  • 线程的自动释放、挂起、运行

    1、自动释放线程对象

    CWinThread *m_jyTestThread;
    m_jyTestThread = ::AfxBeginThread(ThreadFun, (LPVOID)this, THREAD_PRIORITY_NORMAL, 4 * 1024 * 1024, 0);
    if(m_jyTestThread!=NULL)
    {
      //m_bAutoDelete = TRUE; 系统自己清理CWind对象,当然还包括CloseHandle(),ExitInstance()等等一堆函数的调用,程序退出时,就不需要再释放m_jyTestThread对象
      m_jyTestThread->m_bAutoDelete = TRUE;
    }

     如上面代码,线程如果创建成功后,就调用 m_bAutoDelete = TRUE;,当现场结束后它会自动释放线程对象,当程序结束时就没必要再释放m_jyTestThread对象,若再次释放就会报错。

    2.线程运行

    m_jyTestThread->ResumeThread();

    ResumeThread():启动线程  If the function succeeds, the return value is the thread's previous suspend count; otherwise, it is (DWORD) -1.

    解释:ResumeThread函数并不能保证线程真地继续执行,为什么呢?每一个线程都有一个线程暂停计数器,当线程正在运行时计数器为0,当其他线程对此线程使用SuspendThread函数时计数器会增加1,调用ResumeThread会使计数器减小1,所以当调用SuspendThread函数后计数器变为1。但是Windows是一个多线程操作系统,所以很有可能某个其他的线程也对此线程调用了SuspendThread,这时计数器就会变为2,这时再调用ResumeThread只会使计数器变回为1,线程将继续暂停,直到计数器变为0。那么,如何确定线程是否真地被继续执行了呢?很简单,检查函数返回值就可以了。如果返回值为0,则表示线程已经恢复执行了,如果不为0,则表示线程继续被暂停,如果为0xffffffff,则说明函数调用失败了。

    3.线程挂起

    m_jyTestThread->SuspendThread();

    SuspendThread():挂起线程 If the function succeeds, the return value is the thread's previous suspend count; otherwise, it is (DWORD) -1.

    解释和2差不多,这里就不多解释。

    111
  • 相关阅读:
    Linux/shell: remove adjacent similar patterns
    Calculate difference between consecutive data points in a column from a file
    awk
    自定义Cordova插件(基础篇)
    npm init 命令生成package.json文件
    自定义Cordova插件详解
    Android 回退键监听
    Cordova结合Vue学习Camera
    解决悬浮的<header>、<footer>遮挡内容的处理技巧
    npm 是干什么的
  • 原文地址:https://www.cnblogs.com/zwj-199306231519/p/14343558.html
Copyright © 2011-2022 走看看