#include "StdAfx.h"
#include "th.h"

#pragma pack(push,8)
typedef struct tagTHREADNAME_INFO
{
	DWORD dwType; // Must be 0x1000.
	LPCSTR szName; // Pointer to name (in user addr space).
	DWORD dwThreadID; // Thread ID (-1=caller thread).
	DWORD dwFlags; // Reserved for future use, must be zero.
} THREADNAME_INFO;
#pragma pack(pop)
//******************************************************
Cth::Cth(void)
{
	running  =false;
	strcpy(nombre, "Proceso sin nombre");
	m_thread=NULL;
}
//******************************************************
Cth::~Cth(void)
{
	join();
}
//******************************************************
UINT main_th_proceso( LPVOID pp )
{
	Cth *p=(Cth*)pp;
	p->run();
	p->running = false;
	AfxEndThread(0,FALSE);
	return 0;
}
//******************************************************
bool Cth::isRunning()//indica si se esta currando o no
{
	return running;
}
//******************************************************
void Cth::join()//espera al thread
{
	if (m_thread == NULL)
		return;
	WaitForSingleObject(m_thread->m_hThread,INFINITE);
	delete m_thread;
	m_thread = NULL;
};
//******************************************************
BOOL Cth::lanza(char *nombre)//lanzar thread
{
	if (nombre)
		strcpy(this->nombre,nombre);
	m_thread = AfxBeginThread(main_th_proceso, this, THREAD_PRIORITY_NORMAL, 1024, CREATE_SUSPENDED); 
	m_thread->m_bAutoDelete=FALSE;
	//pone el nombre------------------
#ifdef _DEBUG
	SetThName(m_thread->m_nThreadID,this->nombre);
#endif
	running = true;
	m_thread->ResumeThread();
	return TRUE;
};
//******************************************************
UTILES_EXPORT void SetThName( DWORD dwThreadID, char* threadName)
{
	THREADNAME_INFO info;
	info.dwType = 0x1000;
	info.szName = threadName;
	info.dwThreadID = dwThreadID;
	info.dwFlags = 0;

	__try
	{
		RaiseException( MS_VC_EXCEPTION_TH_UTILES, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info );
	}
	__except(EXCEPTION_EXECUTE_HANDLER)
	{
	}
};
//**********************************************************************************************