/*******************************************************************************
* @file TTThread.h 2014\7\1 16:04:05 $
* @author 快刀<kuaidao@mogujie.com>
* @brief windows线程处理的包装
******************************************************************************/
#ifndef TTTHREAD_27D478B1_0BAD_4015_A6E5_8AF2DA7739BF_H__
#define TTTHREAD_27D478B1_0BAD_4015_A6E5_8AF2DA7739BF_H__
#include "GlobalDefine.h"
#include "utilityDll.h"
/******************************************************************************/
NAMESPACE_BEGIN(util)
/**
* The class <code>TTThread</code>
*
*/
class UTILITY_CLASS TTThread
{
public:
/** @name Constructors and Destructor*/
//@{
/**
* Constructor
*/
TTThread();
/**
* Destructor
*/
~TTThread();
//@}
public:
BOOL create();
void destory();
BOOL wait(DWORD dwWaitTime);
inline DWORD getThreadId() { return m_dwThreadID; }
protected:
virtual UInt32 process();
private:
static UInt32 __stdcall _threadProc(void *lpParam);
private:
HANDLE m_hThread;
DWORD m_dwThreadID;
};
NAMESPACE_END(util)
/******************************************************************************/
#endif// TTTHREAD_27D478B1_0BAD_4015_A6E5_8AF2DA7739BF_H__
</pre><pre code_snippet_id="1947715" snippet_file_name="blog_20161025_3_4295493" name="code" class="cpp">
<pre name="code" class="cpp">/*******************************************************************************
* @file TTThread.cpp 2014\7\1 16:04:19 $
* @author 快刀<kuaidao@mogujie.com>
* @brief windows线程处理的包装
******************************************************************************/
#include "stdafx.h"
#include "utility/TTThread.h"
/******************************************************************************/
NAMESPACE_BEGIN(util)
// -----------------------------------------------------------------------------
// TTThread: Public, Constructor
TTThread::TTThread()
:m_hThread(0)
{
}
// -----------------------------------------------------------------------------
// TTThread: Public, Destructor
TTThread::~TTThread()
{
if (m_hThread)
::CloseHandle(m_hThread);
m_hThread = 0;
}
BOOL TTThread::create()
{
m_hThread = (HANDLE)_beginthreadex(0,0, _threadProc, this, 0, (unsigned*)&m_dwThreadID);
if (m_hThread < (HANDLE)2)
{
m_hThread = 0;
m_dwThreadID = 0;
}
return m_hThread >(HANDLE)1;
}
void TTThread::destory()
{
if (m_hThread)
{
::TerminateThread(m_hThread, 0);
WaitForSingleObject(m_hThread, 500);
::CloseHandle(m_hThread);
m_hThread = 0;
m_dwThreadID = 0;
}
}
BOOL TTThread::wait(DWORD dwWaitTime)
{
if (m_hThread == 0)
return TRUE;
return (::WaitForSingleObject(m_hThread, dwWaitTime) != WAIT_TIMEOUT);
}
UInt32 TTThread::process()
{
return 0;
}
UInt32 __stdcall TTThread::_threadProc(void *lpParam)
{
TTThread* pThread = (TTThread*)lpParam;
assert(pThread);
if (pThread != 0)
{
pThread->process();
}
return 0;
}
NAMESPACE_END(util)
/******************************************************************************/
//使用,继承TTThread
class TTHttpThread : public util::TTThread
{
//friend class HttpPoolModule_Impl;
public:
TTHttpThread();
void shutdown();
private:
virtual UInt32 process();
private:
BOOL m_bContinue;
};
//实现
/******************************************************************************/
TTHttpThread::TTHttpThread()
:m_bContinue(TRUE)
{
}
void TTHttpThread::shutdown()
{
if (!wait(2000))
destory();
}
UInt32 TTHttpThread::process()
{
module::IHttpOperation * pHttpOper = NULL;
HttpPoolModule_Impl *pPool = m_pInstance;
while (m_bContinue)
{
if (WAIT_OBJECT_0 != ::WaitForSingleObject(pPool->m_hSemaphore, INFINITE))
{
break;
}
if (!m_bContinue)
{
break;
}
{
CAutoLock lock(&(pPool->m_mtxLock));
if (pPool->m_lstHttpOpers.empty())
pHttpOper = NULL;
else
{
pHttpOper = pPool->m_lstHttpOpers.front();
pPool->m_lstHttpOpers.pop_front();
}
}
try
{
if (m_bContinue && pHttpOper)
{
pHttpOper->process();
pHttpOper->release();
}
}
catch (...)
{
LOG__(ERR, _T("TTHttpThread: Failed to execute opertaion(0x%p)"), pHttpOper);
}
}
return 0;
}