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
|
#include "iostream" #include "windows.h" using
namespace std;
class
CWorkerThread{
public :
CWorkerThread(LPCTSTR m_szName):m_szName(m_szName),m_hThread(INVALID_HANDLE_VALUE){
m_hThread=CreateThread(
NULL,
0,
ThreadProc,
reinterpret_cast<LPVOID>( this ),
0,
NULL
);
}
virtual
~CWorkerThread(){CloseHandle(m_hThread);}
virtual
void WaitForCompletion(){
WaitForSingleObject(m_hThread,INFINITE);
}
virtual
void SetPriority( int
nPriority){
SetThreadPriority(m_hThread,nPriority);
}
virtual
void Suspend(){
SuspendThread(m_hThread);
}
virtual
void Resume(){
ResumeThread(m_hThread);
}
protected :
static
DWORD WINAPI ThreadProc(LPVOID lpParam){
CWorkerThread *pThis=
reinterpret_cast<CWorkerThread*>(lpParam);
pThis->DoStuff();
return
(0);
}
virtual
void DoStuff(){
for ( int
n=0;n<10;n++){
cout<< "Thread" <<m_szName<< "ID:" <<GetCurrentThreadId()<< ",count" <<n<<endl;
}
}
protected :
HANDLE m_hThread;
LPCTSTR m_szName;
}; void
main(){
CWorkerThread wtA( "A" );
CWorkerThread wtB( "B" );
wtA.SetPriority(THREAD_PRIORITY_LOWEST);
wtB.Suspend();
wtA.WaitForCompletion();
wtB.Resume();
wtB.WaitForCompletion();
cout<< "Both threads complete." <<endl;
getchar();
} |