You are on page 1of 9

Hng dn thc hnh H iu hnh nng cao

Thread

Lp trnh a tiu trnh - MultiThread


1. Mc tiu
SV tip cn bi ton a tiu trnh v cc thao tc trn tiu trnh.

2.

t vn

Gi s ta c n (n 2) cng vic v mun thc hin n cng vic ny ng thi. C nhiu cch gii quyt vn ny, trong bi ny s gii thiu mt gii php l s dng thread, mi thread s thc thi mt cng vic v thc thi song song vi cc cng vic cn li.

3.

To v hy tiu trnh
1.1. Gii thiu bi ton

Hy vit chng trnh theo kiu bm gi bng cch mi ln nhn mt phm th s in ra s nhp tri qua t khi chng trnh bt u chy, vi mi nhp bng 100ms, chng trnh s kt thc khi nhn ESC. Vi hm s dng l hm _getch, quyn iu khin s khng c tr li cho n khi c mt phm c nhn, ta s khng th thc hin vic tng bin m sau mi nhp. C nhiu cch tip cn gii quyt yu cu. C th dng c ch Timer nhng vn cn phi c mt lung (tiu trnh) khc nhn WM_TIMER. Hoc c th kim tra ch khi no phm c nhn mi gi hm _getch, cch ny kh phc tp v khng hiu qu khi yu cu bi ton khng ch l m gi m cn phi c a, tng tc vi mng...

1.2. Tip cn bi ton theo hng a lung


Gi s ta c 2 lung thc hin 2 cng vic ring bit (ging nh 2 ngi lm 2 nhim v ring bit) nh sau: + Lung CounterThread: thc hin tng bin m nCount, delay trong 100ms, ri li tng bin m nCount... while (!bESCPressed) { nCount++; Sleep(100); } + Lung GetKeyThread: nhn mt phm bng hm _getch, in gi tr bin m nCount, ri li nhn mt phm _getch... cho n khi phm ESC c nhn. do { bESCPressed = (_getch() == 27); printf("%d\n", nCount); } while (!bESCPressed); Khoa Cng Ngh Thng Tin Trng H KHTN -1-

Hng dn thc hnh H iu hnh nng cao

Thread

R rng vi vic s dng 2 lung cho bi ton trn, vn tr nn n gin.

1.3. iu kin mt chng trnh VC++ chy c ch a lung


Nhn Alt-F7 vo trong Project\Settings...

Nu nh ch Use run-time library: ang Single-Threaded hoc Debug Single-Threaded th phi chuyn sang ch Multithreaded tng ng l Multithreaded v Debug Multithreaded.

chuyn thnh ==>

Cch to mt tiu trnh mi trong Visual C++ Trong Windows khi ng mt lung mi, th ta phi ci t lung trong mt hm, khi hm kt thc th lung c to cng t kt thc. to mt lung mi ta dng hm CreateThread HANDLE CreateThread { Khoa Cng Ngh Thng Tin Trng H KHTN -2-

Hng dn thc hnh H iu hnh nng cao SEC_ATTRS SecurityAttributes, ULONG StackSize, SEC_THREAD_START StartFunction, PVOID ThreadParameter, ULONG CreationFlags, PULONG ThreadId

Thread

}; Trong : SecurityAttributes: tr n cu trc SECURITY_ATTRIBUTES dng xc nh handle ca tin trnh mi to c c k tha bi cc tin trnh con khng. Ch : trong Windows 9x nu tham s ny mang gi tr NULL th handle ny khng th k tha bi tin trnh con khc, trong Windows NT nu mang gi tr NULL c ngha l tiu trnh ny s dng ch an ton mc nh. dwStackSize: kch thc ban u ca stack cc b ca tiu trnh.Nu c gi tr 0 hay nh hn kch thc mc nh th h thng dng kch thc ca tiu trnh to v t ng tng kch thc khi cn. Nu khng b nh th hm to tiu trnh mi s tht bi. Vng stack ny t ng c gii phng khi tiu trnh kt thc. lpStartAddress: tn hm m t cng vic m tiu trnh cn thc hin. Hm ny c khai bo nh sau: DWORD WINAPI ThreadProc(LPVOID lpParameter); lpParameter: tham s c truyn cho tiu trnh. Lu : tham s truyn vo phi p kiu thnh LPVOID sau v hm p kiu ngc tr li. dwCreationFlags: qui nh trng thi tiu trnh khi mi to lp. Nu mang gi tr 0, tiu trnh to ra s thc thi ngay; nu l CREATE_SUSPENDED , tiu trnh s ch cho n khi gi hm ResumeThread. lpThreadId: con tr nhn gi tr tr v l ID ca tiu trnh. Nu thnh cng, nhn gi tr tr v l handle ca tiu trnh. Ngc li nhn gi tr NULL. Mi tiu trnh sau khi c to u c cng u tin mc nh l THREAD_PRIORITY_NORMAL. Ta c th thay i hay xc nh bng hm SetThreadPriority v GetThreadPriority. hoc s dng hm: CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL ); Khoa Cng Ngh Thng Tin Trng H KHTN -3-

Hng dn thc hnh H iu hnh nng cao CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );

Thread

Trong : pfnThreadProc: tn hm m t cng vic m tiu trnh cn thc hin. UINT MyControllingFunction( LPVOID pParam ); pParam: tham s c truyn cho tiu trnh. nPriority: u tin ca thread. pThreadClass: tn lp k tha t CWinThread. Hm ny tr v con tr kiu CWinThread nu thnh cng, ngc li tr v NULL V d: khi mun to tiu trnh CouterThread, ta thc hin Cch 1: Hm CounterThread c ci t nh sau: DWORD WINAPI CounterThread(LPVOID /*pParam*/) { while (!bESCPressed) { nCounter++; Sleep(100); } return 0; } do pParam t s dng nn ta khng cn khai bo trnh b li warning // to thread DWORD dwThreadIdCounter; HANDLE hThreadCounter; hThreadCounter = CreateThread(NULL, 0, CounterThread, NULL, 0, &dwThreadIdCounter); Cch 2: // hm x l thread ci t ging cch 1 // to thread CWinThread *h1; h1 = AfxBeginThread((AFX_THREADPROC) CounterThread, NULL, THREAD_PRIORITY_NORMAL,0,0,NULL); Cch 3: to 1 lp k tha t CWinThread: CCounterThread, khi hm Run (add virtual function) s cha on code x l thread Khoa Cng Ngh Thng Tin Trng H KHTN -4-

Hng dn thc hnh H iu hnh nng cao

Thread

// Hm Run ca lp CCounterThread c ci t nh sau: int CCounterThread::Run() { // TODO: Add your specialized code here and/or call the base class while (!bESCPressed) { nCounter++; Sleep(100); } return CWinThread::Run(); } // to thread CCounterThread* h1; h1 = (CCounterThread*)AfxBeginThread(RUNTIME_CLASS(CCounterThread), THREAD_PRIORITY_NORMAL,0,0,NULL);

Khoa Cng Ngh Thng Tin Trng H KHTN

-5-

Hng dn thc hnh H iu hnh nng cao

Thread

1.4. Thay i trng thi ca tiu trnh


(2) Mi tao
(1)

Ready (5)

(3)

Running (6)

(4)

Ket thuc

Sleeping (7) (9) Waiting

(8) ( 10 )

Suspended

( 11 )

1.4.1. Hm tm dng 1 tiu trnh


DWORD SuspendThread { HANDLE hThread }; Trong : hThread: handle ca tiu trnh mun tm dng Hm SuspendThread tm dng hot ng ca 1 tiu trnh. Gi tr tr v s ln yu cu tm dng (suspend count) trc khi tng hoc 0xFFFFFFFF nu c li. (suspend count s c tng ln 1 mi ln yu cu tm dng tiu trnh).

1.4.2. Hm Hu trng thi tm dng ca 1 tiu trnh


DWORD ResumeThread { HANDLE hThread };

Khoa Cng Ngh Thng Tin Trng H KHTN

-6-

Hng dn thc hnh H iu hnh nng cao Trong : hThread: handle ca tiu trnh mun hu trng thi tm dng

Thread

Hy b trng thi tm dng ca 1 tiu trnh bng cch kim tra gi tr ca s ln yu cu tm dng (suspend count), nu suspend count > 0 , th s gim i 1 hu b 1 ln yu cu tm dng tiu trnh tng ng, khi suspend count = 0, ResumeThread s khi phc li hot ng ca tiu trnh. Gi tr tr v ca hm ny l suspend count lc cha gim hoc 0xFFFFFFFF nu c li.

1.5. Kt thc mt tiu trnh


Ngoi vic mt tiu trnh t kt thc khi hm ci t ca tiu trnh kt thc, ta cn c th yu cu tiu trnh kt thc tc thi. Tuy nhin, vic kt thc hm theo kiu th bo nh vy s dn n vic khng hy b ng n nhng ti nguyn c cp nh m file, kt ni mng... Kt thc tiu trnh hin hnh: dng hm ExitThread(dwExitCode) trong dwExitCode l m li tr v, thng l bng 0. kt thc mt tiu trnh khc ta phi c handle ca tiu trnh (hThread) c tr v khi to tiu trnh, khi dng hm TerminateThread(hThread, dwExitCode) kt thc mt tiu trnh.

1.6. Cc hm khc GetThreadTimes


BOOL { GetThreadTimes HANDLE LPFILETIME LPFILETIME LPFILETIME LPFILETIME }; Tr v thi im to lp tiu trnh lpCreationTime, thi im kt thc tiu trnh lpExitTime, thi gian tiu trnh hot ng trong ch User lpUserTime, trong ch Kernel lpKernelTime ca tiu trnh hThread. hThread, lpCreationTime, lpExitTime, lpKernelTime, lpUserTime

Hm GetExitCodeThread
BOOL { }; Khoa Cng Ngh Thng Tin Trng H KHTN -7GetExitCodeThread HANDLE hThread, LPDWORD lpExitCode

Hng dn thc hnh H iu hnh nng cao

Thread

Xc nh trng thi kt thc ca tiu trnh hThread. Nu tiu trnh ang hot ng, ExitCode nhn gi tr STILL_ACTIVE.

Hm GetCurrendThreadId
HANDLE GetCurrentThreadId (void); Tr v nh danh duy nht ca tiu trnh ang hot ng.

Hm GetCurrentThread
HANDLE GetCurrentThread (void); Tr v handle ca tiu trnh ang hot ng. Lu : i vi lp CWinThread, cc hm trn u l hm thuc lp cWinThread ch c hm Terminate l khng c. Tuy nhin, c th thao tc bnh thng vi cc thread thng qua hThread trong lp CWinThread. Trong mi trng C#, cc bn s s dng lp Thread trong System.Threading.Thread, s dng cc hm: Start, ThreadStart, Resume, Suspend, Abort. (tham kho thm VD trong MSDN)

4.

Bi tp

Bi tp 1: Vit chng trnh tng gim s. Chng trnh gm c 2 tiu trnh, tiu trnh th nht thc hin vic tng gi tr ca bin x, trnh th hai thc hin vic gim gi tr ca bin x. Sau khi tng gim xong xut ni dung ca bin ra mn hnh. Bi tp 2: Vit chng trnh chng trnh hin th 10 k t ngu nhin trn mn hnh, mi k t c qun l bi mt tiu trnh v di chuyn lin tc vi tc ty . Khi di chuyn nu chm bin mn hnh th k t s xut hin li ti gia mn hnh. Chng trnh kt thc khi ngi dng nhn phm bt k. Bi tp 3: Vit chng trnh to ra 3 tiu trnh, mi tiu trnh qun l mt vung c mu khc nhau di chuyn t do trn mn hnh. Chng trnh cho php start, stop, suspend, resume, set priority tng tiu trnh. Bi tp 4: Vit chng trnh c 1 du * di chuyn cho trn mn hnh, khi gp bin du * ny s di li (phn x). Tc di chuyn gia 2 k nhau l 500ms. Khi ngi dng nhn cc phm hoc cc phm W, Z, A, S th ngay lp tc du * s di chuyn ln trn, xung di, sang tri, sang phi. Chng trnh kt thc khi ngi dng nhn phm ESC. Bi tp 5: Vit chng trnh cun chui. Chng trnh c hai tin trnh thc hin thao tc sau: tin trnh th nht thc hin thao tc cun chui, tin trnh th hai xut chui ang cun ra mn hnh. Khoa Cng Ngh Thng Tin Trng H KHTN -8-

Hng dn thc hnh H iu hnh nng cao

Thread

Lu : Cc bi tp khng t nng giao din, ch yu cu hiu c cch to thread v cc thao tc trn thread. i vi bi 1, 5: cc bn nn lm trn Console. i vi cc bi tp 2,3,4 nu cc bn lm trn Console, cc bn xem thm file hng dn console.doc bit cch xut 1 k t ra mn hnh ti 1 to xy. Nu lm trn MFC, cc bn lm dng View (Single Document)

Cc cu hi thng gp khi to thread:


1. Trong console, to thread nhng thread khng chy. Tr li: do hm main sau khi to thread xong kt thc lun chng trnh cc tiu trnh u kt thc. tt c

2. Truyn nhiu tham s vo trong 1 thread. Tr li: nu mun truyn nhiu tham s vo trong 1 thread th phi to 1 struct cha cc tham s sau truyn struct vo hm. MyStruct b; b = *(MyStruct*)lp; // ch cn ly ni dung ca tham s truyn vo AfxBeginThread((AFX_THREADPROC)CounterThread,(LPVOID)&b, THREAD_PRIORITY_NORMAL,0,0,NULL); Nu s dng lp CWinThread, bn nn add cc bin thnh vin cho lp v gn tr trc tip. Khi , bn cn to thread vi c l CREATE_SUNSPENDED sau gi hm ResumeThread

Khoa Cng Ngh Thng Tin Trng H KHTN

-9-

You might also like