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