raSystem  1.0 bata
raThread.cpp
Go to the documentation of this file.
1 #include "raMain.h"
2 
3 namespace System
4 {
6  {
7  m_pThreadStartRoutine = raThread::EntryPoint;
8  }
9  raThread::raThread(LPTHREAD_START_ROUTINE lpExternalRoutine)
10  {
11  Attach(lpExternalRoutine);
12  }
14  {
15  if ( m_ThreadCtx.m_hThread )
16  Stop(true);
17  }
18  DWORD raThread::Start( void* arg)
19  {
20  m_ThreadCtx.m_pUserData = arg;
21  m_ThreadCtx.m_hThread = CreateThread(NULL, 0, m_pThreadStartRoutine, this, 0, &m_ThreadCtx.m_dwTID);
22  m_ThreadCtx.m_dwExitCode = (DWORD)-1;
23 
24  return GetLastError();
25  }
26  DWORD raThread::Stop ( bool bForceKill)
27  {
28  if ( m_ThreadCtx.m_hThread )
29  {
30  GetExitCodeThread(m_ThreadCtx.m_hThread, &m_ThreadCtx.m_dwExitCode);
31 
32  if ( m_ThreadCtx.m_dwExitCode == STILL_ACTIVE && bForceKill )
33  TerminateThread(m_ThreadCtx.m_hThread, DWORD(-1));
34 
35  m_ThreadCtx.m_hThread = NULL;
36  }
37 
38  return m_ThreadCtx.m_dwExitCode;
39  }
40  DWORD raThread::GetExitCode() const
41  {
42  if ( m_ThreadCtx.m_hThread )
43  GetExitCodeThread(m_ThreadCtx.m_hThread, (LPDWORD)&m_ThreadCtx.m_dwExitCode);
44  return m_ThreadCtx.m_dwExitCode;
45  }
46  void raThread::Attach( LPTHREAD_START_ROUTINE lpThreadStartRoutine )
47  {
48  m_pThreadStartRoutine = lpThreadStartRoutine;
49  }
50  void raThread::Detach( void )
51  {
52  m_pThreadStartRoutine = raThread::EntryPoint;
53  }
54  DWORD WINAPI raThread::EntryPoint( LPVOID pArg)
55  {
56  raThread *pParent = reinterpret_cast<raThread*>(pArg);
57  if(!pParent) return STILL_ACTIVE;
58 
59  pParent->ThreadCtor();
60 
61  pParent->Run( pParent->m_ThreadCtx.m_pUserData );
62 
63  pParent->ThreadDtor();
64 
65  return STILL_ACTIVE;
66  }
67  DWORD raThread::Run( LPVOID arg )
68  {
69  return 0;
70  }
71 }
raThread()
Definition: raThread.cpp:5
DWORD Stop(bool bForceKill=false)
Definition: raThread.cpp:26
raThreadContext m_ThreadCtx
Definition: raThread.h:39
virtual void ThreadDtor()
Definition: raThread.h:36
virtual void ThreadCtor()
Definition: raThread.h:35
void Attach(LPTHREAD_START_ROUTINE lpThreadStartRoutine)
Definition: raThread.cpp:46
void Detach(void)
Definition: raThread.cpp:50
~raThread()
Definition: raThread.cpp:13
static DWORD WINAPI EntryPoint(LPVOID pArg)
Definition: raThread.cpp:54
virtual DWORD Run(LPVOID arg)
Definition: raThread.cpp:67
DWORD Start(void *arg=NULL)
Definition: raThread.cpp:18
DWORD GetExitCode() const
Definition: raThread.cpp:40