亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? threadmanager.cpp

?? 一個完整進行顯示和管理的例子
?? CPP
字號:
#include "StdAfx.h"
//#include <conio.h>
#include <process.h>
#include <afxmt.h>		// used for the Critical section stuff
#include "ThreadManager.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

IMPLEMENT_DYNAMIC( CThreadManager, CObject )

//////////////////////////////////////////////////////////////////////////////
// HISTROY
//////////////////////////////////////////////////////////////////////////////
//
// 1997-09-11	2.10 Removed the functionality for a global pointers
// 1997-09-08	2.01 Call Closehandles
// 1997-09-11	2.00 Make a call to the Stop to force a clear up
// 1997-05-23	1.00 Development Started
//
//
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
// Helper Declarations for this module
UINT APIPRIVATE ThreadCareTakerFunction( PVOID pvThreadData );
//////////////////////////////////////////////////////////////////////////////
class CHandle : public CObject
{ 
	DECLARE_DYNAMIC( CHandle )
public: 
	HANDLE m_ThreadHandle; 
};

IMPLEMENT_DYNAMIC( CHandle, CObject )

//////////////////////////////////////////////////////////////////////////////
class CThreadCareTaker : public CObject
{
DECLARE_DYNAMIC( CThreadCareTaker )
public:
	CThreadCareTaker();
	~CThreadCareTaker();
	CBOOL IsValid();
	void AddHandle( CONST HANDLE cHandle );
	void StopThreadCareTaker();
	void CloseThreadHandles();
	static CThreadCareTaker& GetCThreadCareTaker();

	CObList	m_ObList;
	HANDLE m_Handle;
	CCriticalSection m_ThreadCriticalSection;
	CEvent m_AddEvent;
	BOOL m_bKeepGoing;
};

IMPLEMENT_DYNAMIC( CThreadCareTaker, CObject )
//////////////////////////////////////////////////////////////////////////////
// Global Declarations

//////////////////////////////////////////////////////////////////////////////
// StopThreadManager
// 1997-09-11	Removed the functionality from this call
// 1997-09-08	Call Closehandles
//
void StopThreadManager( CDWORD cdwTimeToWait/*=INFINITE*/ )
{ 
	UNREFERENCED_PARAMETER( cdwTimeToWait );
	// Just give it enough time to perform normal tidy up
	Sleep( 510 );
}		// End StopThreadManager


//////////////////////////////////////////////////////////////////////////////
// GetCThreadCareTaker
// 1997-09-11	Function created
// This static object will be destroyed when the main(WinMain) loses functional
// focus
//
CThreadCareTaker & CThreadCareTaker::GetCThreadCareTaker()
{
	static CThreadCareTaker __CThreadCareTaker;
	return( __CThreadCareTaker );
}		// End CThreadCareTaker::GetCThreadCareTaker
//////////////////////////////////////////////////////////////////////////////
// CThreadCareTaker
// 1997-05-23	Development Started
//
CThreadCareTaker::CThreadCareTaker()
	: m_AddEvent(FALSE, TRUE)			// Manual mode on m_AddEvent
	 ,m_Handle( HANDLE( NULL ) )
{
	m_AddEvent.ResetEvent();		// Set our Event to empty
	m_bKeepGoing = TRUE;
	UINT nThreadId = 0;
	PCHAR cpszBuffer = new char;
	m_Handle = (HANDLE)_beginthreadex( NULL, 0, ThreadCareTakerFunction, PVOID( cpszBuffer ), 0/*CREATE_SUSPENDED*/, &nThreadId );
}		// End CThreadCareTaker::CThreadCareTaker


//////////////////////////////////////////////////////////////////////////////
// ~CThreadCareTaker
// 1997-09-11	Make a call to the Stop to force a clear up
// 1997-05-23	Development Started
//
CThreadCareTaker::~CThreadCareTaker()
{
	StopThreadCareTaker();
}		// End CThreadCareTaker::~CThreadCareTaker


//////////////////////////////////////////////////////////////////////////////
// IsValid
// 1997-05-01	Function Created
//
CBOOL CThreadCareTaker::IsValid()
{
	BOOL bValid_Status = FALSE;
	if ( (this != NULL)
		&& AfxIsValidAddress( this, sizeof( CThreadCareTaker ) )
		)
		bValid_Status = TRUE;
	return( bValid_Status );
}		// End CThreadCareTaker::IsValid


//////////////////////////////////////////////////////////////////////////////
// AddHandle
// 1997-05-23	Development started
//
void CThreadCareTaker::AddHandle( CONST HANDLE cHandle )
{
	CHandle *pHandle = new CHandle;
	pHandle->m_ThreadHandle = cHandle;
	m_ObList.AddTail( pHandle );
	m_AddEvent.PulseEvent();
}		// End CThreadCareTaker::AddHandle


//////////////////////////////////////////////////////////////////////////////
// StopThreadCareTaker
// 1997-09-11	Function Created
//
void CThreadCareTaker::StopThreadCareTaker()
{ 	// Allow CloseThreadHandles to be called naturally
	m_bKeepGoing = FALSE;
	m_AddEvent.SetEvent();
	// Forcibly remove the contents as the static is going out of scope
	if ( m_ObList.GetCount() )
	{
		POSITION pos1, pos2;
		CHandle *pHandle = (CHandle *)NULL;
		DWORD dwExitCode = 0L;
		for( pos1=m_ObList.GetHeadPosition(); (pos2=pos1)!=POSITION(NULL); )
		{
			pHandle = DYNAMIC_DOWNCAST( CHandle, m_ObList.GetNext( pos1 ) );
			CSingleLock SingleLock( &m_ThreadCriticalSection, FALSE );
			VERIFY( ::GetExitCodeThread( pHandle->m_ThreadHandle, &dwExitCode ) );
			if ( dwExitCode == STILL_ACTIVE )
			{	// Thread is active so have to force a close
				// If the target thread owns a critical section, the critical 
				// section will not be released. 
				// If the target thread is executing certain kernel32 calls 
				// when it is terminated, the kernel32 state for the thread抯 
				// process could be inconsistent. 
				// If the target thread is manipulating the global state of a 
				// shared DLL, the state of the DLL could be destroyed, 
				// affecting other users of the DLL. 
//				::TerminateThread( pHandle->m_ThreadHandle, &dwExitCode );
				CBOOL cbThread_Still_Active = FALSE;
				if ( cbThread_Still_Active )
					OutputDebugString( "A Thread is still active on close of CareTaker\n" );
			}
			if ( SingleLock.Lock( 1000 ) )
			{
				m_ObList.RemoveAt( pos2 );	// Have to use old position
				VERIFY( SingleLock.Unlock() );
//				VERIFY( ::CloseHandle( pHandle->m_ThreadHandle ) );
				delete pHandle;
				pHandle = (CHandle *)NULL;
			}
		}
	}
	if ( m_Handle != HANDLE( NULL ) )
	{	// Free the Caretaker Thread function handle
		::WaitForSingleObject( m_Handle, 1000 );
		VERIFY( ::CloseHandle( m_Handle ) );
		m_Handle = HANDLE( NULL );
	}
}		// End CThreadCareTaker::StopThreadCareTaker


//////////////////////////////////////////////////////////////////////////////
// CloseThreadHandles
// 1997-09-08	Put an If around the SingleLock
// 1997-05-23	Function Moved
//
void CThreadCareTaker::CloseThreadHandles()
{
	if ( m_ObList.GetCount() )
	{
		POSITION pos1, pos2;
		CHandle *pHandle = (CHandle *)NULL;
		DWORD dwExitCode = 0L;
		for( pos1=m_ObList.GetHeadPosition(); (pos2=pos1)!=POSITION(NULL); )
		{
			pHandle = DYNAMIC_DOWNCAST( CHandle, m_ObList.GetNext( pos1 ) );
			VERIFY( ::GetExitCodeThread( pHandle->m_ThreadHandle, &dwExitCode ) );
//			if ( (dwExitCode == 0)
//				|| (dwExitCode == 1)
//				)
			if ( dwExitCode != STILL_ACTIVE )
			{
				CSingleLock SingleLock( &m_ThreadCriticalSection, FALSE );
				if ( SingleLock.Lock( 1000 ) )
				{
					m_ObList.RemoveAt( pos2 );	// Have to use old position
					VERIFY( SingleLock.Unlock() );
					VERIFY( ::CloseHandle( pHandle->m_ThreadHandle ) );
					delete pHandle;
					pHandle = (CHandle *)NULL;
				}
			}
		}
	}
}		// End CThreadCareTaker::CloseThreadHandles


//////////////////////////////////////////////////////////////////////////////
// ThreadCareTakerFunction
// 1997-05-23	Development Started
//
UINT APIPRIVATE ThreadCareTakerFunction( PVOID pvThreadData )
{
	delete pvThreadData;
	HANDLE hCurrentThread = GetCurrentThread();
	SetThreadPriority( hCurrentThread, THREAD_PRIORITY_LOWEST );
	while ( CThreadCareTaker::GetCThreadCareTaker().m_bKeepGoing )
	{
		CThreadCareTaker::GetCThreadCareTaker().m_AddEvent.Lock( 500 );	// sleep for 1/2 secs or until our event is triggered
		CThreadCareTaker::GetCThreadCareTaker().CloseThreadHandles();
	}
	CThreadCareTaker::GetCThreadCareTaker().CloseThreadHandles();
	SetThreadPriority( hCurrentThread, THREAD_PRIORITY_NORMAL );
	return( 0 );
}		// End ThreadCareTakerFunction


//////////////////////////////////////////////////////////////////////////////
// CThreadManager
// 1997-05-23	Development Started
//
CThreadManager::CThreadManager( CONSOLETHREADPROC pfnThreadProc, LPVOID pParam )
{
	UINT nThreadId = 0;
	_ASSERTE( CThreadCareTaker::GetCThreadCareTaker().IsValid() );
	m_Handle = (HANDLE)_beginthreadex( NULL, 0, pfnThreadProc, pParam, CREATE_SUSPENDED, &nThreadId );
	if ( CThreadCareTaker::GetCThreadCareTaker().m_bKeepGoing )
	{
		CSingleLock SingleLock( &CThreadCareTaker::GetCThreadCareTaker().m_ThreadCriticalSection, FALSE );
		VERIFY( SingleLock.Lock( 1000 ) );
		ASSERT( m_Handle );
		CThreadCareTaker::GetCThreadCareTaker().AddHandle( m_Handle );
	}
	else
	{
		static BOOL bDisplayed = FALSE;
		static CBOOL scbThreadCareTaker_IsValid_Failed = FALSE;
		if ( !bDisplayed )
		{
			bDisplayed = TRUE;
			_ASSERTE( scbThreadCareTaker_IsValid_Failed );
			bDisplayed = FALSE;
		}
	}
}		// End CThreadManager::CThreadManager


//////////////////////////////////////////////////////////////////////////////
// CThreadManager
// 1997-05-23	Development Started
//
CThreadManager::~CThreadManager()
{
}		// End CThreadManager::~CThreadManager


//////////////////////////////////////////////////////////////////////////////
// public: RunThread
// 1997-07-17	Now return the success of restarting
// 1997-05-23	Development Started
//
CBOOL CThreadManager::RunThread()
{
	return( ::ResumeThread( m_Handle ) != 0xFFFFFFFF );
}		// End CThreadManager::RunThread

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91久久精品日日躁夜夜躁欧美| 亚洲动漫第一页| 色老汉av一区二区三区| 亚洲一区二区三区小说| 91免费国产在线观看| 国产一区二区在线观看视频| 亚洲国产精品久久一线不卡| 亚洲欧洲性图库| 国产午夜精品一区二区三区嫩草 | av中文字幕在线不卡| 国内精品嫩模私拍在线| 视频一区欧美精品| 五月激情综合网| 亚洲国产日韩a在线播放| 中文字幕成人网| 日韩免费观看高清完整版| 欧美日韩免费一区二区三区| 色94色欧美sute亚洲线路二| 国产精品一色哟哟哟| 粉嫩绯色av一区二区在线观看| 国产麻豆成人传媒免费观看| 国产伦精品一区二区三区免费迷 | 国产高清在线精品| 国产精品综合在线视频| 国产一级精品在线| 国产69精品一区二区亚洲孕妇| 国产在线精品国自产拍免费| 国产福利一区二区三区视频| 国产高清在线精品| 成人av在线网站| 91美女在线观看| 欧美午夜寂寞影院| 欧美一级视频精品观看| 精品区一区二区| 久久精品视频网| 国产日本欧美一区二区| 国产视频亚洲色图| 亚洲欧美综合色| 亚洲综合色视频| 一区2区3区在线看| 毛片av中文字幕一区二区| 久久99蜜桃精品| 成人精品一区二区三区四区| 在线观看视频91| 日韩精品一区二区三区视频播放 | 久久99精品久久久久| 国产精品中文欧美| 一本久道中文字幕精品亚洲嫩| 欧美性受xxxx黑人xyx| 日本韩国一区二区| 欧美乱妇23p| 精品国产凹凸成av人网站| 国产精品亲子伦对白| 亚洲成av人综合在线观看| 国内精品伊人久久久久影院对白| 国产成人免费视| 在线看不卡av| 日本一二三四高清不卡| 日韩国产欧美三级| 北岛玲一区二区三区四区| 欧美性生活大片视频| 国产欧美日韩不卡免费| 亚洲国产视频网站| 国产成人精品免费| 777色狠狠一区二区三区| 精品免费一区二区三区| 亚洲精品中文字幕乱码三区| 日韩电影在线观看电影| 国产激情偷乱视频一区二区三区| 成人手机在线视频| 91精品国产综合久久婷婷香蕉 | 美国毛片一区二区三区| 在线视频国产一区| 日韩欧美区一区二| 国产精品午夜免费| 亚洲综合一区二区三区| 国产乱码精品一区二区三 | 久久只精品国产| 日日欢夜夜爽一区| 在线精品视频一区二区| 国产精品欧美综合在线| 国产乱子伦一区二区三区国色天香 | 国产激情一区二区三区| 日韩一区二区三区在线视频| 亚洲韩国精品一区| 91久久精品午夜一区二区| 国产精品久久久久久久岛一牛影视| 麻豆国产精品777777在线| eeuss鲁一区二区三区| 欧美日本在线观看| 亚洲制服丝袜一区| 在线亚洲精品福利网址导航| 最新国产の精品合集bt伙计| 成人三级伦理片| 国产拍揄自揄精品视频麻豆| 国产九色精品成人porny| 欧美v国产在线一区二区三区| 舔着乳尖日韩一区| 欧美日本国产视频| 午夜欧美大尺度福利影院在线看| 国产99精品国产| 日韩一级片网站| 免费成人在线视频观看| 欧美不卡一二三| 国产一区日韩二区欧美三区| 日韩免费观看高清完整版| 免费的成人av| 欧美精品久久天天躁| 日韩黄色一级片| 在线观看免费成人| 一区2区3区在线看| 欧美日韩国产免费| 免费看精品久久片| 久久久不卡网国产精品一区| 丁香婷婷综合色啪| 亚洲免费在线播放| 777亚洲妇女| 日韩av中文字幕一区二区三区| 欧美日韩大陆一区二区| 婷婷成人激情在线网| 精品福利二区三区| 国产综合久久久久影院| 国产精品国产三级国产有无不卡 | 亚洲小说欧美激情另类| 91精品蜜臀在线一区尤物| 国产精品综合视频| 亚洲欧洲日产国产综合网| 97久久超碰精品国产| 五月天欧美精品| 国产日产欧美精品一区二区三区| 在线亚洲一区二区| 狠狠色2019综合网| 一区二区三区中文字幕在线观看| 日韩一级大片在线| av在线播放不卡| 青青草国产精品亚洲专区无| 日韩欧美国产系列| 国产精品69久久久久水密桃| 国产精品美女久久久久高潮| 欧美一区二区三区免费视频| 成人va在线观看| 麻豆精品久久久| 一区二区三区在线免费视频 | 琪琪久久久久日韩精品| ㊣最新国产の精品bt伙计久久| 91精品久久久久久久99蜜桃| 91社区在线播放| 国产在线精品免费| 成人免费在线视频| 精品国产髙清在线看国产毛片| 一本一本大道香蕉久在线精品| 久久er99精品| 日本成人在线电影网| 亚洲美女一区二区三区| 欧美国产日韩在线观看| 欧美一级艳片视频免费观看| 日本高清不卡一区| 成人av免费观看| 精品影视av免费| 亚洲无线码一区二区三区| 亚洲欧洲日产国产综合网| 国产片一区二区| 久久久久久久久久久久电影| 日韩午夜精品电影| 欧美一区二区在线看| 欧美日韩精品一区二区三区四区 | 国产精品久久久久久久久快鸭 | 国产精品欧美综合在线| 日本一区二区不卡视频| 综合久久综合久久| 亚洲国产综合视频在线观看| 亚洲一区日韩精品中文字幕| 亚洲国产精品视频| 日韩不卡在线观看日韩不卡视频| 久久精品国产色蜜蜜麻豆| 国产精品一区二区久久精品爱涩| 高清不卡在线观看av| 91视频免费播放| 在线播放视频一区| 精品国产精品网麻豆系列 | 亚洲精品大片www| 亚洲va天堂va国产va久| 九九**精品视频免费播放| 国产成人av电影在线| 日本道色综合久久| 在线综合+亚洲+欧美中文字幕| 日韩欧美中文字幕公布| 欧美高清在线精品一区| 亚洲bt欧美bt精品| 国产精品一区免费在线观看| 色综合久久久久综合体| 欧美mv和日韩mv国产网站| 国产精品福利一区二区三区| 亚洲国产综合91精品麻豆| 国产主播一区二区三区| 欧美专区亚洲专区| 欧美经典一区二区| 日韩电影在线看| 色综合一个色综合亚洲| 精品美女在线播放|