2024-12-21 10:04:04 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
|
|
// INCLUDE
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
#include "STDAFX.H"
|
|
|
|
|
|
#include "THREAD.H"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
|
|
// IMPLEMENTATION
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// TYPE : FUNCTION
|
|
|
|
|
|
// NAME : CThread::CThread
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PARM : N/A
|
|
|
|
|
|
// RETV : N/A
|
|
|
|
|
|
// PRGM : B4nFter
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
CThread::CThread()
|
|
|
|
|
|
{
|
|
|
|
|
|
Reset();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// TYPE : FUNCTION
|
|
|
|
|
|
// NAME : CThread::~CThread
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// DESC : <20>Ҹ<EFBFBD><D2B8><EFBFBD>
|
|
|
|
|
|
// PARM : N/A
|
|
|
|
|
|
// RETV : N/A
|
|
|
|
|
|
// PRGM : B4nFter
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
CThread::~CThread()
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// TYPE : FUNCTION
|
|
|
|
|
|
// NAME : CThread::Start
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD>带 <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PARM : 1 . lpfnThreadProc - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ν<EFBFBD><CEBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// 2 . lpParam - <20><><EFBFBD><EFBFBD><EFBFBD>忡 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڰ<EFBFBD> (<28>⺻<EFBFBD><E2BABB> NULL)
|
|
|
|
|
|
// 3 . lpszName - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD> (<28>⺻<EFBFBD><E2BABB> NULL)
|
|
|
|
|
|
// 4 . uStackSize - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ũ<EFBFBD><C5A9> (<28>⺻<EFBFBD><E2BABB> 0 <20><> 1MB)
|
|
|
|
|
|
// 5 . bSuspend - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28>⺻<EFBFBD><E2BABB> FALSE)
|
|
|
|
|
|
// 6 . bAutoEnd - <20><><EFBFBD><EFBFBD> <20><> <20>ڵ<EFBFBD> <20>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28>⺻<EFBFBD><E2BABB> TRUE, FALSE <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD> CThread::End() ȣ<><C8A3>)
|
|
|
|
|
|
// 7 . m_lpPrepProc - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><>ƾ (<28>⺻<EFBFBD><E2BABB> NULL)
|
|
|
|
|
|
// 8 . m_lpPostProc - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><>ƾ (<28>⺻<EFBFBD><E2BABB> NULL)
|
|
|
|
|
|
// 9 . m_lpPrepProcParam - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ƾ<EFBFBD><C6BE> <20><><EFBFBD>Ǵ<DEB5> <20><><EFBFBD><EFBFBD> (<28>⺻<EFBFBD><E2BABB> NULL)
|
|
|
|
|
|
// 10 . m_lpPostProcParam - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ƾ<EFBFBD><C6BE> <20><><EFBFBD>Ǵ<DEB5> <20><><EFBFBD><EFBFBD> (<28>⺻<EFBFBD><E2BABB> NULL)
|
|
|
|
|
|
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PRGM : B4nFter
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
BOOL CThread::Start(
|
|
|
|
|
|
LPFN_THREAD_PROC lpfnThreadProc,
|
|
|
|
|
|
LPVOID lpParam,
|
|
|
|
|
|
LPCTSTR lpszName,
|
|
|
|
|
|
UINT uStackSize,
|
|
|
|
|
|
BOOL bSuspend,
|
|
|
|
|
|
BOOL bAutoEnd,
|
|
|
|
|
|
LPFN_PREP_PROC lpfnPrepProc,
|
|
|
|
|
|
LPFN_POST_PROC lpfnPostProc,
|
|
|
|
|
|
LPVOID lpPrepProcParam,
|
|
|
|
|
|
LPVOID lpPostProcParam
|
|
|
|
|
|
)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_hHandle) {
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!lpfnThreadProc) {
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m_lpfnThreadProc = lpfnThreadProc;
|
|
|
|
|
|
m_lpParam = lpParam;
|
|
|
|
|
|
m_bAutoEnd = bAutoEnd;
|
|
|
|
|
|
m_lpfnPrepProc = lpfnPrepProc;
|
|
|
|
|
|
m_lpfnPostProc = lpfnPostProc;
|
|
|
|
|
|
m_lpPrepProcParam = lpPrepProcParam;
|
|
|
|
|
|
m_lpPostProcParam = lpPostProcParam;
|
|
|
|
|
|
|
|
|
|
|
|
if (lpszName) {
|
|
|
|
|
|
STRNCPY(m_szName, lpszName, COUNT_OF(m_szName));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m_hHandle = (HANDLE)::_beginthreadex(NULL, uStackSize, ThreadProc, (LPVOID)(this), (bSuspend)?(CREATE_SUSPENDED):(0), &m_uId);
|
|
|
|
|
|
if (!m_hHandle) {
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// TYPE : FUNCTION
|
|
|
|
|
|
// NAME : CThread::Reset
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PARM : N/A
|
|
|
|
|
|
// RETV : N/A
|
|
|
|
|
|
// PRGM : B4nFter
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
VOID CThread::End()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (DF_MEMSTATE_DDDD == (DWORD_PTR)m_hHandle) {
|
|
|
|
|
|
// HEAP <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (m_hHandle) {
|
|
|
|
|
|
DWORD dwExitCode = 0;
|
|
|
|
|
|
::GetExitCodeThread(m_hHandle, &dwExitCode);
|
|
|
|
|
|
if (STILL_ACTIVE == dwExitCode) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ÿ<EFBFBD><C3BF><EFBFBD> TLS<4C><53> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (STL <20>ڿ<EFBFBD><DABF><EFBFBD> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Access Violation <20><><EFBFBD>ܸ<EFBFBD> <20><><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD>, <20>ý<EFBFBD><C3BD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ñ<EFBFBD>?)
|
|
|
|
|
|
std::set<DWORD>::iterator it = m_setTlsValue.begin();
|
|
|
|
|
|
for (; it != m_setTlsValue.end() ; ++it) {
|
|
|
|
|
|
if ((*it) != TLS_OUT_OF_INDEXES) {
|
|
|
|
|
|
::TlsFree(*it);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
m_setTlsValue.clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
::CloseHandle(m_hHandle);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Reset();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// TYPE : FUNCTION
|
|
|
|
|
|
// NAME : CThread::Reset
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PARM : N/A
|
|
|
|
|
|
// RETV : N/A
|
|
|
|
|
|
// PRGM : B4nFter
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
VOID CThread::Reset()
|
|
|
|
|
|
{
|
|
|
|
|
|
m_hHandle = NULL;
|
|
|
|
|
|
m_uId = 0;
|
|
|
|
|
|
m_lpfnThreadProc = NULL;
|
|
|
|
|
|
m_lpParam = NULL;
|
|
|
|
|
|
m_szName[0] = _T('\0');
|
|
|
|
|
|
m_bAutoEnd = TRUE;
|
|
|
|
|
|
m_lpfnPrepProc = NULL;
|
|
|
|
|
|
m_lpfnPostProc = NULL;
|
|
|
|
|
|
m_lpPrepProcParam = NULL;
|
|
|
|
|
|
m_lpPostProcParam = NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// TYPE : FUNCTION
|
|
|
|
|
|
// NAME : CThread::ThreadProc
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƾ, CThread:m_lpfnThreadProc <20><> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PARM : 1 . lpParam - <20><><EFBFBD><EFBFBD><EFBFBD>忡 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڰ<EFBFBD>
|
|
|
|
|
|
// RETV : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
|
|
|
|
|
|
// PRGM : B4nFter
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
UINT __stdcall CThread::ThreadProc(LPVOID lpParam)
|
|
|
|
|
|
{
|
|
|
|
|
|
CThread* lpThread = (CThread*)lpParam;
|
|
|
|
|
|
|
|
|
|
|
|
if (!lpThread || !lpThread->m_lpfnThreadProc) {
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if ((DF_MEMSTATE_DDDD != ((DWORD_PTR)(lpThread->m_hHandle))) &&
|
|
|
|
|
|
::_tcsncmp(lpThread->m_szName, _T(""), COUNT_OF(lpThread->m_szName))
|
|
|
|
|
|
)
|
|
|
|
|
|
{
|
|
|
|
|
|
lpThread->SetName(lpThread->m_szName);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if ((DF_MEMSTATE_DDDD != ((DWORD_PTR)(lpThread->m_hHandle))) &&
|
|
|
|
|
|
lpThread->GetPrepProc()
|
|
|
|
|
|
)
|
|
|
|
|
|
{
|
|
|
|
|
|
lpThread->GetPrepProc()(lpThread->GetPrepProcParam());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
UINT iRetVal = 0;
|
|
|
|
|
|
if ((DF_MEMSTATE_DDDD != ((DWORD_PTR)(lpThread->m_hHandle))) &&
|
|
|
|
|
|
lpThread->m_lpfnThreadProc
|
|
|
|
|
|
)
|
|
|
|
|
|
{
|
|
|
|
|
|
iRetVal = lpThread->m_lpfnThreadProc(lpThread->GetParam());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if ((DF_MEMSTATE_DDDD != ((DWORD_PTR)(lpThread->m_hHandle))) &&
|
|
|
|
|
|
lpThread->GetPostProc()
|
|
|
|
|
|
)
|
|
|
|
|
|
{
|
|
|
|
|
|
lpThread->GetPostProc()(lpThread->GetPostProcParam());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if ((DF_MEMSTATE_DDDD != ((DWORD_PTR)(lpThread->m_hHandle))) &&
|
|
|
|
|
|
lpThread->IsAutoEnd()
|
|
|
|
|
|
)
|
|
|
|
|
|
{
|
|
|
|
|
|
lpThread->End();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return iRetVal;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// TYPE : FUNCTION
|
|
|
|
|
|
// NAME : CThread::SetName
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// DESC : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PARM : 1 . lpszName - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>
|
|
|
|
|
|
// RETV : N/A
|
|
|
|
|
|
// PRGM : B4nFter
|
|
|
|
|
|
// P.S.>
|
|
|
|
|
|
// - <20><><EFBFBD><EFBFBD><EFBFBD>带 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20><> (CThread::Start() <20><><EFBFBD><EFBFBD> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>, CThread::ThreadProc() <20><><EFBFBD><EFBFBD> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>)
|
|
|
|
|
|
// - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD> ǥ<>ô<EFBFBD> Debug <20><> Thread <20><>ȭâ<C8AD><C3A2><EFBFBD><EFBFBD> Ȯ<><C8AE> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
VOID CThread::SetName(LPCTSTR lpszName)
|
|
|
|
|
|
{
|
|
|
|
|
|
SetName(lpszName, (DWORD)(-1));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// TYPE : FUNCTION
|
|
|
|
|
|
// NAME : CThread::SetName
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// DESC : Ư<><C6AF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PARM : 1 . lpszName - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>
|
|
|
|
|
|
// 2 . pThreadID - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID
|
|
|
|
|
|
// RETV : N/A
|
|
|
|
|
|
// PRGM : B4nFter
|
|
|
|
|
|
// P.S.>
|
|
|
|
|
|
// - <20><><EFBFBD><EFBFBD><EFBFBD>带 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20><> (CThread::Start() <20><><EFBFBD><EFBFBD> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>, CThread::ThreadProc() <20><><EFBFBD><EFBFBD> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>)
|
|
|
|
|
|
// - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD> ǥ<>ô<EFBFBD> Debug <20><> Thread <20><>ȭâ<C8AD><C3A2><EFBFBD><EFBFBD> Ȯ<><C8AE> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
VOID CThread::SetName(LPCTSTR lpszName, DWORD pThreadID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!lpszName) {
|
|
|
|
|
|
BASE_RETURN_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
USES_CONVERSION;
|
|
|
|
|
|
|
|
|
|
|
|
THREADNAMEINFO stThreadNameInfo;
|
|
|
|
|
|
stThreadNameInfo.dwType = 0x1000;
|
|
|
|
|
|
stThreadNameInfo.szName = T2CA(lpszName);
|
|
|
|
|
|
stThreadNameInfo.dwThreadID = pThreadID;
|
|
|
|
|
|
stThreadNameInfo.dwFlags = 0;
|
|
|
|
|
|
__try
|
|
|
|
|
|
{
|
|
|
|
|
|
::RaiseException(0x406D1388, 0, sizeof(THREADNAMEINFO)/sizeof(DWORD), (const ULONG_PTR*)&stThreadNameInfo);
|
|
|
|
|
|
}
|
|
|
|
|
|
__except(EXCEPTION_CONTINUE_EXECUTION)
|
|
|
|
|
|
{
|
|
|
|
|
|
NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// TYPE : FUNCTION
|
|
|
|
|
|
// NAME : CThread::GetName
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PARM : N/A
|
|
|
|
|
|
// RETV : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>
|
|
|
|
|
|
// PRGM : B4nFter
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
LPCTSTR CThread::GetName() const
|
|
|
|
|
|
{
|
|
|
|
|
|
return m_szName;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// TYPE : FUNCTION
|
|
|
|
|
|
// NAME : CThread::Suspend
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Suspend <20><><EFBFBD>¸<EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PARM : N/A
|
|
|
|
|
|
// RETV : <20><><EFBFBD><EFBFBD>:previous suspend count / <20><><EFBFBD><EFBFBD>:0xFFFFFFFF
|
|
|
|
|
|
// PRGM : B4nFter
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
DWORD CThread::Suspend()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!m_hHandle) {
|
|
|
|
|
|
return (DWORD)(0xFFFFFFFF);
|
|
|
|
|
|
}
|
|
|
|
|
|
return ::SuspendThread(m_hHandle);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// TYPE : FUNCTION
|
|
|
|
|
|
// NAME : CThread::Resume
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Suspend <20><><EFBFBD>¸<EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PARM : N/A
|
|
|
|
|
|
// RETV : <20><><EFBFBD><EFBFBD>:previous suspend count / <20><><EFBFBD><EFBFBD>:0xFFFFFFFF
|
|
|
|
|
|
// PRGM : B4nFter
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
DWORD CThread::Resume()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!m_hHandle) {
|
|
|
|
|
|
return (DWORD)(0xFFFFFFFF);
|
|
|
|
|
|
}
|
|
|
|
|
|
return ::ResumeThread(m_hHandle);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// TYPE : FUNCTION
|
|
|
|
|
|
// NAME : CThread::Terminate
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD>带 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PARM : 1 . dwExitCode - Thread <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
|
|
|
|
|
|
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PRGM : B4nFter
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
BOOL CThread::Terminate(DWORD dwExitCode)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!m_hHandle) {
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
}
|
|
|
|
|
|
return ::TerminateThread(m_hHandle, dwExitCode);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// TYPE : FUNCTION
|
|
|
|
|
|
// NAME : CThread::SetPriority
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>켱<EFBFBD><ECBCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PARM : 1 . iPriority - <20>켱<EFBFBD><ECBCB1><EFBFBD><EFBFBD> (1~31<33><31><EFBFBD><EFBFBD>, <20><>ȣ<EFBFBD><C8A3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>켱<EFBFBD><ECBCB1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
|
|
|
|
|
|
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PRGM : B4nFter
|
|
|
|
|
|
// P.S.>
|
|
|
|
|
|
// - MSDN <20><> Scheduling Priorities <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
BOOL CThread::SetPriority(INT iPriority)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!m_hHandle) {
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
}
|
|
|
|
|
|
return ::SetThreadPriority(m_hHandle, iPriority);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// TYPE : FUNCTION
|
|
|
|
|
|
// NAME : CThread::SetAffinity
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ģȭ<C4A3><C8AD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PARM : 1 . dwMask - ģȭ<C4A3><C8AD> <20><><EFBFBD><EFBFBD>ũ (ģȭ<C4A3><C8AD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD> <20>ϴ<EFBFBD> CPU<50><55><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> 1<><31> <20><>)
|
|
|
|
|
|
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PRGM : B4nFter
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
BOOL CThread::SetAffinity(DWORD dwMask)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!m_hHandle) {
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
}
|
|
|
|
|
|
return (BOOL)::SetThreadAffinityMask(m_hHandle, dwMask);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// TYPE : FUNCTION
|
|
|
|
|
|
// NAME : CThread::GetTlsIndex
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// DESC : Thread Local Storage <20><> <20>Ҵ<EFBFBD><D2B4>ϰ<EFBFBD> <20>Ҵ<EFBFBD><D2B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PARM : N/A
|
|
|
|
|
|
// RETV : <20>Ҵ<EFBFBD><D2B4><EFBFBD> TLS<4C><53> <20>ε<EFBFBD><CEB5><EFBFBD>
|
|
|
|
|
|
// PRGM : B4nFter
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
DWORD CThread::GetTlsIndex()
|
|
|
|
|
|
{
|
|
|
|
|
|
DWORD dwTlsIndex = ::TlsAlloc();
|
|
|
|
|
|
if (dwTlsIndex != TLS_OUT_OF_INDEXES) {
|
|
|
|
|
|
m_setTlsValue.insert(dwTlsIndex);
|
|
|
|
|
|
}
|
|
|
|
|
|
return dwTlsIndex;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// TYPE : FUNCTION
|
|
|
|
|
|
// NAME : CThread::SetTlsValue
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// DESC : Thread Local Storage <20><> Ư<><C6AF> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PARM : 1 . dwTlsIndex - TLS <20>ε<EFBFBD><CEB5><EFBFBD>
|
|
|
|
|
|
// 2 . lpTlsValue - TLS <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
|
|
|
|
|
|
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PRGM : B4nFter
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
BOOL CThread::SetTlsValue(DWORD dwTlsIndex, LPVOID lpTlsValue)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::set<DWORD>::iterator it = m_setTlsValue.find(dwTlsIndex);
|
|
|
|
|
|
if (it != m_setTlsValue.end()) {
|
|
|
|
|
|
return ::TlsSetValue(dwTlsIndex, lpTlsValue);
|
|
|
|
|
|
}
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// TYPE : FUNCTION
|
|
|
|
|
|
// NAME : CThread::FreeTlsIndex
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
// DESC : Thread Local Storage <20><> Ư<><C6AF> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// PARM : 1 . dwTlsIndex - TLS <20>ε<EFBFBD><CEB5><EFBFBD>
|
|
|
|
|
|
// RETV : N/A
|
|
|
|
|
|
// PRGM : B4nFter
|
|
|
|
|
|
//*---------------------------------------------------------------
|
|
|
|
|
|
VOID CThread::FreeTlsIndex(DWORD dwTlsIndex)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (dwTlsIndex == TLS_OUT_OF_INDEXES) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::set<DWORD>::iterator it = m_setTlsValue.find(dwTlsIndex);
|
|
|
|
|
|
if (it != m_setTlsValue.end()) {
|
|
|
|
|
|
m_setTlsValue.erase(dwTlsIndex);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|