Professional Documents
Culture Documents
Thread
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...
Thread
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.
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-
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);
-5-
Thread
Ready (5)
(3)
Running (6)
(4)
Ket thuc
(8) ( 10 )
Suspended
( 11 )
-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.
Hm GetExitCodeThread
BOOL { }; Khoa Cng Ngh Thng Tin Trng H KHTN -7GetExitCodeThread HANDLE hThread, LPDWORD lpExitCode
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-
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)
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
-9-