挂起正在运行的线程

   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


你可能感兴趣的:(挂起正在运行的线程)