掛起正在運行的線程

   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


發佈了32 篇原創文章 · 獲贊 9 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章