Artifact 1216ad374a35c8fc863768ad256c0f179ac3279e:
0000: 23 69 6e 63 6c 75 64 65 20 22 73 74 64 61 66 78 #include "stdafx
0010: 2e 68 22 0d 0a 23 69 6e 63 6c 75 64 65 20 22 74 .h"..#include "t
0020: 68 72 65 61 64 2e 68 22 0d 0a 75 73 69 6e 67 20 hread.h"..using
0030: 6e 61 6d 65 73 70 61 63 65 20 6b 69 3b 0d 0a 0d namespace ki;...
0040: 0a 0d 0a 0d 0a 2f 2f 3d 3d 3d 3d 3d 3d 3d 3d 3d .....//=========
0050: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0060: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0070: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0080: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0090: 0d 0a 0d 0a 54 68 72 65 61 64 4d 61 6e 61 67 65 ....ThreadManage
00a0: 72 2a 20 54 68 72 65 61 64 4d 61 6e 61 67 65 72 r* ThreadManager
00b0: 3a 3a 70 55 6e 69 71 75 65 49 6e 73 74 61 6e 63 ::pUniqueInstanc
00c0: 65 5f 3b 0d 0a 0d 0a 54 68 72 65 61 64 4d 61 6e e_;....ThreadMan
00d0: 61 67 65 72 3a 3a 54 68 72 65 61 64 4d 61 6e 61 ager::ThreadMana
00e0: 67 65 72 28 29 0d 0a 09 3a 20 74 68 72 65 61 64 ger()...: thread
00f0: 4e 75 6d 5f 28 30 29 0d 0a 7b 0d 0a 09 2f 2f 20 Num_(0)..{...//
0100: 97 42 88 ea 82 cc 83 43 83 93 83 58 83 5e 83 93 .B.....C...X.^..
0110: 83 58 82 cd 8e 84 82 c5 82 b7 81 42 0d 0a 09 70 .X.........B...p
0120: 55 6e 69 71 75 65 49 6e 73 74 61 6e 63 65 5f 20 UniqueInstance_
0130: 3d 20 74 68 69 73 3b 0d 0a 7d 0d 0a 0d 0a 2f 2f = this;..}....//
0140: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0150: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0160: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0170: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0180: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0d 0a 0d 0a 44 57 4f =========....DWO
0190: 52 44 20 57 49 4e 41 50 49 20 54 68 72 65 61 64 RD WINAPI Thread
01a0: 4d 61 6e 61 67 65 72 3a 3a 54 68 72 65 61 64 53 Manager::ThreadS
01b0: 74 75 62 46 75 6e 63 28 76 6f 69 64 2a 20 70 61 tubFunc(void* pa
01c0: 72 61 6d 29 0d 0a 7b 0d 0a 09 52 75 6e 6e 61 62 ram)..{...Runnab
01d0: 6c 65 2a 20 72 20 3d 20 73 74 61 74 69 63 5f 63 le* r = static_c
01e0: 61 73 74 3c 52 75 6e 6e 61 62 6c 65 2a 3e 28 70 ast<Runnable*>(p
01f0: 61 72 61 6d 29 3b 0d 0a 09 72 2d 3e 53 74 61 72 aram);...r->Star
0200: 74 54 68 72 65 61 64 28 29 3b 0d 0a 09 72 2d 3e tThread();...r->
0210: 46 69 6e 61 6c 69 7a 65 54 68 72 65 61 64 28 29 FinalizeThread()
0220: 3b 0d 0a 09 72 65 74 75 72 6e 20 30 3b 0d 0a 7d ;...return 0;..}
0230: 0d 0a 0d 0a 76 6f 69 64 20 54 68 72 65 61 64 4d ....void ThreadM
0240: 61 6e 61 67 65 72 3a 3a 52 75 6e 28 20 52 75 6e anager::Run( Run
0250: 6e 61 62 6c 65 26 20 72 20 29 0d 0a 7b 0d 0a 09 nable& r )..{...
0260: 72 2e 50 6c 65 61 73 65 45 78 69 74 28 29 3b 0d r.PleaseExit();.
0270: 0a 0d 0a 09 44 57 4f 52 44 20 69 64 3b 0d 0a 09 ....DWORD id;...
0280: 72 2e 68 54 68 72 65 61 64 5f 20 3d 20 3a 3a 43 r.hThread_ = ::C
0290: 72 65 61 74 65 54 68 72 65 61 64 28 0d 0a 09 09 reateThread(....
02a0: 4e 55 4c 4c 2c 20 30 2c 20 26 54 68 72 65 61 64 NULL, 0, &Thread
02b0: 53 74 75 62 46 75 6e 63 2c 20 26 72 2c 20 43 52 StubFunc, &r, CR
02c0: 45 41 54 45 5f 53 55 53 50 45 4e 44 45 44 2c 20 EATE_SUSPENDED,
02d0: 26 69 64 20 29 3b 0d 0a 09 72 2e 68 45 76 65 6e &id );...r.hEven
02e0: 74 5f 20 20 3d 20 3a 3a 43 72 65 61 74 65 45 76 t_ = ::CreateEv
02f0: 65 6e 74 28 20 4e 55 4c 4c 2c 20 54 52 55 45 2c ent( NULL, TRUE,
0300: 20 46 41 4c 53 45 2c 20 4e 55 4c 4c 20 29 3b 0d FALSE, NULL );.
0310: 0a 09 3a 3a 52 65 73 75 6d 65 54 68 72 65 61 64 ..::ResumeThread
0320: 28 20 72 2e 68 54 68 72 65 61 64 5f 20 29 3b 0d ( r.hThread_ );.
0330: 0a 7d 0d 0a 0d 0a 2f 2f 3d 3d 3d 3d 3d 3d 3d 3d .}....//========
0340: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0350: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0360: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0370: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0380: 3d 0d 0a 0d 0a 52 75 6e 6e 61 62 6c 65 3a 3a 52 =....Runnable::R
0390: 75 6e 6e 61 62 6c 65 28 29 0d 0a 09 3a 20 68 54 unnable()...: hT
03a0: 68 72 65 61 64 5f 28 20 4e 55 4c 4c 20 29 0d 0a hread_( NULL )..
03b0: 09 2c 20 68 45 76 65 6e 74 5f 20 28 20 4e 55 4c ., hEvent_ ( NUL
03c0: 4c 20 29 0d 0a 7b 0d 0a 7d 0d 0a 0d 0a 52 75 6e L )..{..}....Run
03d0: 6e 61 62 6c 65 3a 3a 7e 52 75 6e 6e 61 62 6c 65 nable::~Runnable
03e0: 28 29 0d 0a 7b 0d 0a 09 50 6c 65 61 73 65 45 78 ()..{...PleaseEx
03f0: 69 74 28 29 3b 20 2f 2f 20 82 a0 82 ad 82 dc 82 it(); // .......
0400: c5 8d c5 8f 49 8e e8 92 69 0d 0a 7d 0d 0a 0d 0a ....I...i..}....
0410: 62 6f 6f 6c 20 52 75 6e 6e 61 62 6c 65 3a 3a 69 bool Runnable::i
0420: 73 52 75 6e 6e 69 6e 67 28 29 20 63 6f 6e 73 74 sRunning() const
0430: 0d 0a 7b 0d 0a 09 72 65 74 75 72 6e 20 68 54 68 ..{...return hTh
0440: 72 65 61 64 5f 20 21 3d 20 4e 55 4c 4c 3b 0d 0a read_ != NULL;..
0450: 7d 0d 0a 0d 0a 62 6f 6f 6c 20 52 75 6e 6e 61 62 }....bool Runnab
0460: 6c 65 3a 3a 69 73 45 78 69 74 52 65 71 75 65 73 le::isExitReques
0470: 74 65 64 28 29 20 63 6f 6e 73 74 0d 0a 7b 0d 0a ted() const..{..
0480: 09 72 65 74 75 72 6e 20 57 41 49 54 5f 4f 42 4a .return WAIT_OBJ
0490: 45 43 54 5f 30 20 3d 3d 20 3a 3a 57 61 69 74 46 ECT_0 == ::WaitF
04a0: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 20 orSingleObject(
04b0: 68 45 76 65 6e 74 5f 2c 20 30 20 29 3b 0d 0a 7d hEvent_, 0 );..}
04c0: 0d 0a 0d 0a 76 6f 69 64 20 52 75 6e 6e 61 62 6c ....void Runnabl
04d0: 65 3a 3a 46 69 6e 61 6c 69 7a 65 54 68 72 65 61 e::FinalizeThrea
04e0: 64 28 29 0d 0a 7b 0d 0a 09 3a 3a 43 6c 6f 73 65 d()..{...::Close
04f0: 48 61 6e 64 6c 65 28 20 68 54 68 72 65 61 64 5f Handle( hThread_
0500: 20 29 3b 0d 0a 09 68 54 68 72 65 61 64 5f 20 3d );...hThread_ =
0510: 20 4e 55 4c 4c 3b 0d 0a 09 3a 3a 43 6c 6f 73 65 NULL;...::Close
0520: 48 61 6e 64 6c 65 28 20 68 45 76 65 6e 74 5f 20 Handle( hEvent_
0530: 29 3b 0d 0a 09 68 45 76 65 6e 74 5f 20 20 3d 20 );...hEvent_ =
0540: 4e 55 4c 4c 3b 0d 0a 7d 0d 0a 0d 0a 76 6f 69 64 NULL;..}....void
0550: 20 52 75 6e 6e 61 62 6c 65 3a 3a 50 6c 65 61 73 Runnable::Pleas
0560: 65 45 78 69 74 28 29 0d 0a 7b 0d 0a 09 69 66 28 eExit()..{...if(
0570: 20 48 41 4e 44 4c 45 20 68 74 20 3d 20 68 54 68 HANDLE ht = hTh
0580: 72 65 61 64 5f 20 29 0d 0a 09 7b 0d 0a 09 09 3a read_ )...{....:
0590: 3a 53 65 74 45 76 65 6e 74 28 20 68 45 76 65 6e :SetEvent( hEven
05a0: 74 5f 20 29 3b 0d 0a 09 09 3a 3a 57 61 69 74 46 t_ );....::WaitF
05b0: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 20 orSingleObject(
05c0: 68 74 2c 20 49 4e 46 49 4e 49 54 45 20 29 3b 0d ht, INFINITE );.
05d0: 0a 09 7d 0d 0a 7d 0d 0a ..}..}..