-
Notifications
You must be signed in to change notification settings - Fork 51
/
Copy pathMyThread.cpp
77 lines (73 loc) · 1.45 KB
/
MyThread.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include "MyThread.h"
#include"task.h"
#include "MyThreadPool.h"
#include<cassert>
#define WAIT_TIME 20
CMyThread::CMyThread(CBaseThreadPool*threadPool)
{
m_pTask=NULL;
//m_bIsActive=false;
m_pThreadPool=threadPool;
m_hEvent=CreateEvent(NULL,false,false,NULL);
m_bIsExit=false;
}
//bool CMyThread::m_bIsActive=false;
CMyThread::~CMyThread(void)
{
CloseHandle(m_hEvent);
CloseHandle(m_hThread);
}
bool CMyThread::startThread()
{
m_hThread=CreateThread(0,0,threadProc,this,0,&m_threadID);
if(m_hThread==INVALID_HANDLE_VALUE)
{
return false;
}
return true;
}
bool CMyThread::suspendThread()
{
ResetEvent(m_hEvent);
return true;
}
//有任务到来,通知线程继续执行。
bool CMyThread::resumeThread()
{
SetEvent(m_hEvent);
return true;
}
DWORD WINAPI CMyThread::threadProc( LPVOID pParam )
{
CMyThread *pThread=(CMyThread*)pParam;
while(!pThread->m_bIsExit)
{
DWORD ret=WaitForSingleObject(pThread->m_hEvent,INFINITE);
if(ret==WAIT_OBJECT_0)
{
if(pThread->m_pTask)
{
pThread->m_pTask->taskProc();//执行任务。
//delete pThread->m_pTask;//用户传入的空间交由用户处理,内部不处理。如从CTask从堆栈分配,此处会有问题。
pThread->m_pTask=NULL;
pThread->m_pThreadPool->SwitchActiveThread(pThread);
}
}
}
return 0;
}
//将任务关联到线程类。
bool CMyThread::assignTask( CTask*pTask )
{
assert(pTask);
if(!pTask)
return false;
m_pTask=pTask;
return true;
}
//开始执行任务。
bool CMyThread::startTask()
{
resumeThread();
return true;
}