挂起正在运行的线程

   Handle  m_hTread= (HANDLE)_beginthreadex(NULL, 0, _AutoUpdateProc, this, 0, &uThreadID);
    if(m_hTread != NULL)
    {
        g_ulAbortDownload = 0;
        GetDlgItem(IDOK)->EnableWindow(FALSE);
       //::CloseHandle(m_hTread);                    //此处线程运行函数退出的时候再closeHandle 否则 挂起线程会失败
    }
    else // 创建线程失败
    {        
        MessageBox(g_language.GetString(7,_T("Create Thread Fail...")).c_str(),g_language.GetString(4,_T("TIP")).c_str(),MB_ICONWARNING|MB_TOPMOST);
        GetDlgItem(IDOK)->EnableWindow(TRUE);

    }



dwCode = SuspendThread(m_hTread); //点击取消时挂起线程 不一定挂起 句柄结构中 nThreadSuspendCount 是否《=0

if(dwCode == 0xffffffff)

    挂起失败

Sleep(10000);

ResumeThread(m_hTread);   //重新唤醒线程运行



1,线程的handle用处:

   线程的handle是指向“线程的内核对象”的,而不是指向线程本身.每个内核对象只是内核分配的一个内存块,并且只能由内核访问。该内存块是一种数据结构,它的成员负责维护对象的各种信息(eg:安全性描述,引用计数等)。

2,CloseHandle()作用

  在CreateThread成功之后会返回一个hThread的handle,且内核对象的计数加1,CloseHandle之后,引用计数减1,当变为0时,系统删除内核对象。

  但是这个handle并不能完全代表这个线程,它仅仅是线程的一个“标识”,系统和用户可以利用它对相应的线程进行必要的操纵。如果在线程成功创建后,不再需要用到这个句柄,就可以在创建成功后,线程退出前直接CloseHandle掉,但这并不会影响到线程的运行。

3,不执行CloseHandle() 带来的后果

  若在线程执行完之后,没有通过CloseHandle()将引用计数减1,在进程执行期间,将会造成内核对象的泄露,相当与句柄泄露,但不同于内存泄露,这势必会对系统的效率带来一定程度上的负面影响。但是,请记住,当进程结束退出后,系统仍然会自动帮你清理这些资源。但是在这里不推荐这种做法,毕竟不是一个良好的编程习惯!呵呵!

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/apple_operation/archive/2007/09/12/1782239.aspx


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值