ÄãµÄλÖãºÈí¼þÓë¹âÅÌ>
ÓÃVC++5.0ʵÏÖ¶àÏ̵߳ĵ÷¶ÈºÍ´¦Àí
2000-01-30 00:00:00¡¤ ÕÅÍò´º¡¤CPCW

br> Ò»¶àÈÎÎñ£¬¶à½ø³ÌºÍ¶àÏß³Ì
---- Windows95 ºÍWindowsNT ²Ù×÷ϵͳ֧³Ö¶àÈÎÎñµ÷¶ÈºÍ´¦Àí£¬»ùÓڸù¦ÄÜËùÌṩµÄ¶àÈÎÎñ¿Õ¼ä£¬³ÌÐòÔ±¿ÉÒÔÍêÈ«¿ØÖÆÓ¦ÓóÌÐòÖÐÿһ¸öƬ¶ÎµÄÔËÐУ¬´Ó¶ø±àд¸ßЧÂʵÄÓ¦ÓóÌÐò¡£
---- Ëùν¶àÈÎÎñͨ³£°üÀ¨ÕâÑùÁ½´óÀࣺ¶à½ø³ÌºÍ¶àÏ̡߳£½ø³ÌÊÇÖ¸ÔÚϵͳÖÐÕýÔÚÔËÐеÄÒ»¸öÓ¦ÓóÌÐò£»Ïß³ÌÊÇϵͳ·ÖÅä´¦ÀíÆ÷ʱ¼ä×ÊÔ´µÄ»ù±¾µ¥Ôª£¬»òÕß˵½ø³ÌÖ®ÄÚ¶ÀÁ¢Ö´ÐеÄÒ»¸öµ¥Ôª¡£¶ÔÓÚ²Ù×÷ϵͳ¶øÑÔ£¬Æäµ÷¶Èµ¥ÔªÊÇÏ̡߳£Ò»¸ö½ø³ÌÖÁÉÙ°üÀ¨Ò»¸öỊ̈߳¬Í¨³£½«¸ÃÏ̳߳ÆÎªÖ÷Ï̡߳£Ò»¸ö½ø³Ì´ÓÖ÷Ï̵߳ÄÖ´ÐпªÊ¼½ø¶ø´´½¨Ò»¸ö»ò¶à¸ö¸½¼ÓỊ̈߳¬¾ÍÊÇËùν»ùÓÚ¶àÏ̵߳ĶàÈÎÎñ¡£

---- ¿ª·¢¶àÏß³ÌÓ¦ÓóÌÐò¿ÉÒÔÀûÓÃ32 λWindows »·¾³ÌṩµÄWin32 API ½Ó¿Úº¯Êý£¬Ò²¿ÉÒÔÀûÓÃVC++ ÖÐÌṩµÄMFC Àà¿â½øÐпª·¢¡£¶àÏ̱߳à³ÌÔÚÕâÁ½ÖÖ·½Ê½ÏÂÔ­ÀíÊÇÒ»ÑùµÄ£¬Óû§¿ÉÒÔ¸ù¾ÝÐèҪѡÔñÏàÓ¦µÄ¹¤¾ß¡£±¾ÎÄÖØµã½²ÊöÓÃVC++5.0 ÌṩµÄMFC Àà¿âʵÏÖ¶àÏ̵߳÷¶ÈÓë´¦ÀíµÄ·½·¨ÒÔ¼°ÓÉÏ̶߳àÈÎÎñËùÒý·¢µÄͬ²½¶àÈÎÎñÌØÕ÷£¬×îºóÏêϸ½âÊÍÒ»¸öʵÏÖ¶àÏ̵߳ÄÀý³Ì¡£

¶þ»ùÓÚMFC µÄ¶àÏ̱߳à³Ì
---- 1 MFC ¶Ô¶àÏ̵߳ÄÖ§³Ö
---- MFC Àà¿âÌṩÁ˶àÏ̱߳à³ÌÖ§³Ö£¬¶ÔÓÚÓû§±à³ÌʵÏÖÀ´Ëµ¸ü¼Ó·½±ã¡£·Ç³£ÖØÒªµÄÒ»µã¾ÍÊÇ£¬ÔÚ¶à´°¿ÚÏß³ÌÇé¿öÏ£¬MFC Ö±½ÓÌṩÁËÓû§½Ó¿ÚÏ̵߳ÄÉè¼Æ¡£

---- MFC Çø·ÖÁ½ÖÖÀàÐ͵ÄỊ̈߳º¸¨ÖúỊ̈߳¨Worker Thread£©ºÍÓû§½çÃæÏß³Ì(UserInterface Thread)¡£¸¨ÖúÏß³ÌûÓÐÏûÏ¢»úÖÆ£¬Í¨³£ÓÃÀ´Ö´Ðкǫ́¼ÆËãºÍά»¤ÈÎÎñ¡£MFC ΪÓû§½çÃæÏß³ÌÌṩÏûÏ¢»úÖÆ£¬ÓÃÀ´´¦ÀíÓû§µÄÊäÈ룬ÏìÓ¦Óû§²úÉúµÄʼþºÍÏûÏ¢¡£µ«¶ÔÓÚWin32 µÄAPI À´Ëµ£¬ÕâÁ½ÖÖÏ̲߳¢Ã»ÓÐÇø±ð£¬ËüÖ»ÐèÒªÏß³ÌµÄÆô¶¯µØÖ·ÒÔ±ãÆô¶¯Ïß³ÌÖ´ÐÐÈÎÎñ¡£Óû§½çÃæÏ̵߳ÄÒ»¸öµäÐÍÓ¦ÓþÍÊÇÀàCWinApp£¬´ó¼Ò¶ÔÀàCwinApp ¶¼±È½ÏÊìϤ£¬ËüÊÇCWinThread ÀàµÄÅÉÉúÀ࣬ӦÓóÌÐòµÄÖ÷Ïß³ÌÊÇÓÉËüÌṩ£¬²¢ÓÉËü¸ºÔð´¦ÀíÓû§²úÉúµÄʼþºÍÏûÏ¢¡£ÀàCwinThread ÊÇÓû§½Ó¿ÚÏ̵߳Ļù±¾Àà¡£CWinThread µÄ¶ÔÏóÓÃÒÔά»¤Ìض¨Ï̵߳ľֲ¿Êý¾Ý¡£ÒòΪ´¦ÀíÏֲ߳̾¿Êý¾ÝÒÀÀµÓÚÀàCWinThread£¬ËùÒÔËùÓÐʹÓÃMFC µÄÏ̶߳¼±ØÐëÓÉMFC À´´´½¨¡£ÀýÈ磬ÓÉrun-time º¯Êý_beginthreadex ´´½¨µÄÏ߳̾Ͳ»ÄÜʹÓÃÈκÎMFC API¡£

---- 2 ¸¨ÖúÏ̺߳ÍÓû§½çÃæÏ̵߳Ĵ´½¨ºÍÖÕÖ¹

---- Òª´´½¨Ò»¸öỊ̈߳¬ÐèÒªµ÷Óú¯ÊýAfxBeginThread¡£¸Ãº¯Êýͨ¹ý²ÎÊýÖØÔØ¾ßÓÐÁ½ÖÖ°æ±¾£¬·Ö±ð¶ÔÓ¦¸¨ÖúÏ̺߳ÍÓû§½ Ï̡߳£ÎÞÂÛÊǸ¨ÖúÏ̻߳¹ÊÇÓû§½çÃæỊ̈߳¬¶¼ÐèÒªÖ¸¶¨¶îÍâµÄ²ÎÊýÒÔÐÞ¸ÄÓÅÏȼ¶£¬¶ÑÕ»´óС£¬´´½¨±êÖ¾ºÍ°²È«ÌØÐԵȡ£º¯ÊýAfxBeginThread ·µ»ØÖ¸ÏòCWinThread Àà¶ÔÏóµÄÖ¸Õë¡£

---- ´´½¨ÖúÊÖÏß³ÌÏà¶Ô¼òµ¥¡£Ö»ÐèÒªÁ½²½£ºÊµÏÖ¿ØÖƺ¯ÊýºÍÆô¶¯Ï̡߳£Ëü²¢²»±ØÐë´ÓCWinThread ÅÉÉúÒ»¸öÀà¡£¼òҪ˵Ã÷ÈçÏ£º

---- 1. ʵÏÖ¿ØÖƺ¯Êý¡£¿ØÖƺ¯Êý¶¨Òå¸ÃÏ̡߳£µ±½øÈë¸Ãº¯Êý£¬Ïß³ÌÆô¶¯£»Í˳öʱ£¬Ïß³ÌÖÕÖ¹¡£¸Ã¿ØÖƺ¯ÊýÉùÃ÷ÈçÏ£º

UINT MyControllingFunction( LPVOID pParam );
---- ¸Ã²ÎÊýÊÇÒ»¸öµ¥¾«¶È32 λֵ¡£¸Ã²ÎÊý½ÓÊÕµÄÖµ½«ÔÚÏ̶߳ÔÏó´´½¨Ê±´«µÝ¸ø¹¹Ô캯Êý¡£¿ØÖƺ¯Êý½«ÓÃijÖÖ·½Ê½½âÊ͸ÃÖµ¡£¿ÉÒÔÊÇÊýÁ¿Öµ£¬»òÊÇÖ¸Ïò°üÀ¨¶à¸ö²ÎÊýµÄ½á¹¹µÄÖ¸Õ룬ÉõÖÁ¿ÉÒÔ±»ºöÂÔ¡£Èç¹û¸Ã²ÎÊýÊÇÖ¸½á¹¹£¬Ôò²»½ö¿ÉÒÔ½«Êý¾Ý´Óµ÷Óú¯Êý´«¸øỊ̈߳¬Ò²¿ÉÒÔ´ÓÏ̻߳ش«¸øµ÷Óú¯Êý¡£Èç¹ûʹÓÃÕâÑùµÄ½á¹¹»Ø´«Êý¾Ý£¬µ±½á¹û×¼±¸ºÃµÄʱºò£¬Ïß³ÌҪ֪ͨµ÷Óú¯Êý¡£µ±º¯Êý½áÊøÊ±£¬Ó¦·µ»ØÒ»¸öUINT ÀàÐ͵ÄÖµÖµ£¬Ö¸Ã÷½áÊøµÄÔ­Òò¡£Í¨³££¬·µ»Ø0 ±íÃ÷³É¹¦£¬ÆäËüÖµ·Ö±ð´ú±í²»Í¬µÄ´íÎó¡£
---- 2. Æô¶¯Ï̡߳£Óɺ¯ÊýAfxBeginThread ´´½¨²¢³õʼ»¯Ò»¸öCWinThread ÀàµÄ¶ÔÏ󣬯ô¶¯²¢·µ»Ø¸ÃÏ̵߳ĵØÖ·¡£ÔòÏ߳̽øÈëÔËÐÐ״̬¡£

---- 3. ¾ÙÀý˵Ã÷¡£ÏÂÃæÓüòµ¥µÄ´úÂë˵Ã÷ÔõÑù¶¨ÒåÒ»¸ö¿ØÖƺ¯ÊýÒÔ¼°ÈçºÎÔÚ³ÌÐòµÄÆäËü²¿·ÖʹÓá£

UINT MyThreadProc( LPVOID pParam )
{
CMyObject* pObject = (CMyObject*)pParam;
if (pObject == NULL ||
!pObject- >IsKindOf(RUNTIME_CLASS(CMyObject)))
return -1; //·Ç·¨²ÎÊý
¡­¡­//¾ßÌåʵÏÖÄÚÈÝ
return 0; //Ï̳߳ɹ¦½áÊø
}

//ÔÚ³ÌÐòÖе÷ÓÃÏ̵߳ĺ¯Êý
¡­¡­
pNewObject = new CMyObject;
AfxBeginThread(MyThreadProc, pNewObject);
    ¡­¡­
    ´´½¨Óû§½çÃæÏß³ÌÓÐÁ½ÖÖ·½·¨¡£
---- µÚÒ»ÖÖ·½·¨£¬Ê×ÏÈ´ÓCWinTread ÀàÅÉÉúÒ»¸öÀࣨעÒâ±ØÐëÒªÓúêDECLARE_DYNCREATE ºÍIMPLEMENT_DYNCREATE ¶Ô¸ÃÀà½øÐÐÉùÃ÷ºÍʵÏÖ£©£»È»ºóµ÷Óú¯ÊýAfxBeginThread ´´½¨CWinThread ÅÉÉúÀàµÄ¶ÔÏó½øÐгõʼ»¯Æô¶¯Ïß³ÌÔËÐС£³ýÁ˵÷Óú¯ÊýAfxBeginThread Ö®Íâ, Ò²¿ÉÒÔ²ÉÓõڶþÖÖ·½·¨£¬¼´ÏÈͨ¹ý¹¹Ô캯Êý´´½¨ÀàCWinThread µÄÒ»¸ö¶ÔÏó£¬È»ºóÓɳÌÐòÔ±µ÷Óú¯Êý::CreateThread À´Æô¶¯Ï̡߳£Í¨³£ÀàCWinThread µÄ¶ÔÏóÔÚ¸ÃÏ̵߳ÄÉú´æÆÚ½áÊøÊ±½«×Ô¶¯ÖÕÖ¹£¬Èç¹û³ÌÐòԱϣÍû×Ô¼ºÀ´¿ØÖÆ£¬ÔòÐèÒª½«m_bAutoDelete ÉèΪFALSE¡£ÕâÑùÔÚÏß³ÌÖÕÖ¹Ö®ºóÀàCWinThread ¶ÔÏóÈÔÈ»´æÔÚ£¬Ö»ÊÇÔÚÕâÖÖÇé¿öÏÂÐèÒªÊÖ¶¯É¾³ýCWinThread ¶ÔÏó¡£
---- ͨ³£Ï̺߳¯Êý½áÊøÖ®ºó£¬Ï߳̽«×ÔÐÐÖÕÖ¹¡£ÀàCwinThread ½«ÎªÎÒÃÇÍê³É½áÊøÏ̵߳Ť×÷¡£Èç¹ûÔÚÏ̵߳ÄÖ´Ðйý³ÌÖгÌÐòԱϣÍûÇ¿ÐÐÖÕÖ¹Ï̵߳ϰ£¬ÔòÐèÒªÔÚÏß³ÌÄÚ²¿µ÷ÓÃAfxEndThread(nExitCode)¡£Æä²ÎÊýΪÏ߳̽áÊøÂë¡£ÕâÑù½«ÖÕÖ¹Ï̵߳ÄÔËÐУ¬²¢ÊÍ·ÅÏß³ÌËùÕ¼ÓõÄ×ÊÔ´¡£Èç¹û´ÓÁíÒ»¸öÏß³ÌÀ´ÖÕÖ¹¸ÃỊ̈߳¬Ôò±ØÐëÔÚÁ½¸öÏß³ÌÖ®¼äÉèÖÃͨÐÅ·½·¨¡£Èç¹û´ÓÏß³ÌÍⲿÀ´ÖÕÖ¹Ï̵߳ϰ£¬»¹¿ÉÒÔʹÓÃWin32 º¯Êý£¨CWinThread À಻Ìṩ¸Ã³ÉÔ±º¯Êý£©£ºBOOL TerminateThread(HANDLE hThread,DWORD dwExitcode)¡£µ«ÔÚʵ¼Ê³ÌÐòÉè¼ÆÖжԸú¯ÊýµÄʹÓÃÒ»¶¨Òª½÷É÷£¬ÒòΪһµ©¸ÃÃüÁî·¢³ö£¬½«Á¢¼´ÖÕÖ¹¸ÃỊ̈߳¬²¢²»ÊÍ·ÅÏß³ÌËùÕ¼ÓõÄ×ÊÔ´£¬ÕâÑù¿ÉÄÜ»áÒýÆðϵͳ²»Îȶ¨¡£

---- Èç¹ûËùÖÕÖ¹µÄÏß³ÌÊǽø³ÌÄÚµÄ×îºóÒ»¸öỊ̈߳¬ÔòÔÚ¸ÃÏß³ÌÖÕÖ¹Ö®ºó½ø³ÌÒ²ÏàÓ¦ÖÕÖ¹¡£

---- 3 ½ø³ÌºÍÏ̵߳ÄÓÅÏȼ¶ÎÊÌâ

---- ÔÚWindows95 ºÍWindowsNT ²Ù×÷ϵͳµ±ÖУ¬ÈÎÎñÊÇÓÐÓÅÏȼ¶µÄ£¬¹²ÓÐ32 ¼¶£¬´Ó0 µ½31£¬ÏµÍ³°´ÕÕ²»Í¬µÄÓÅÏȼ¶µ÷¶ÈÏ̵߳ÄÔËÐС£

---- 1) 0-15 ¼¶ÊÇÆÕͨÓÅÏȼ¶£¬Ï̵߳ÄÓÅÏȼ¶¿ÉÒÔ¶¯Ì¬±ä»¯¡£¸ßÓÅÏȼ¶Ïß³ÌÓÅÏÈÔËÐУ¬Ö»ÓиßÓÅÏȼ¶Ï̲߳»ÔËÐÐʱ£¬²Åµ÷¶ÈµÍÓÅÏȼ¶Ïß³ÌÔËÐС£ÓÅÏȼ¶ÏàͬµÄḬ̈߳´ÕÕʱ¼äƬÂÖÁ÷ÔËÐС£2) 16-30 ¼¶ÊÇʵʱÓÅÏȼ¶£¬ÊµÊ±ÓÅÏȼ¶ÓëÆÕͨÓÅÏȼ¶µÄ×î´óÇø±ðÔÚÓÚÏàͬÓÅÏȼ¶½ø³ÌµÄÔËÐв»°´ÕÕʱ¼äƬÂÖת£¬¶øÊÇÏÈÔËÐеÄÏ߳̾ÍÏÈ¿ØÖÆCPU£¬Èç¹ûËü²»Ö÷¶¯·ÅÆú¿ØÖÆ£¬Í¬¼¶»òµÍÓÅÏȼ¶µÄÏ߳̾ÍÎÞ·¨ÔËÐС£

---- Ò»¸öÏ̵߳ÄÓÅÏȼ¶Ê×ÏÈÊôÓÚÒ»¸öÀ࣬ȻºóÊÇÆäÔÚ¸ÃÀàÖеÄÏà¶ÔλÖá£Ïß³ÌÓÅÏȼ¶µÄ¼ÆËã¿ÉÒÔÈçÏÂʽ±íʾ£º

---- Ïß³ÌÓÅÏȼ¶= ½ø³ÌÀà»ù±¾ÓÅÏȼ¶+ Ïß³ÌÏà¶ÔÓÅÏȼ¶

---- ½ø³ÌÀàµÄ»ù±¾ÓÅÏȼ¶£º

    IDLE_PROCESS_CLASS
    NORMAL_PROCESS_CLASS
    HIGH_PROCESS_CLASS
    REAL_TIME_PROCESS_CLASS
Ï̵߳ÄÏà¶ÔÓÅÏȼ¶£º
    THREAD_PRIORITY_IDLE
£¨×îµÍÓÅÏȼ¶£¬½öÔÚϵͳ¿ÕÏÐʱִÐУ©
    THREAD_PRIORITY_LOWEST       
    THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_NORMAL £¨È±Ê¡£©
    THREAD_PRIORITY_ABOVE_NORMAL   
    THREAD_PRIORITY_HIGHEST       
    THREAD_PRIORITY_CRITICAL
£¨·Ç³£¸ßµÄÓÅÏȼ¶£©
---- 4 Ïß³Ìͬ²½ÎÊÌâ

---- ±àд¶àÏß³ÌÓ¦ÓóÌÐòµÄ×îÖØÒªµÄÎÊÌâ¾ÍÊÇÏß³ÌÖ®¼äµÄ×ÊԴͬ²½·ÃÎÊ¡£ÒòΪ¶à¸öÏß³ÌÔÚ¹²Ïí×ÊԴʱÈç¹û·¢Éú·ÃÎʳåͻͨ³£»á²úÉú²»ÕýÈ·µÄ½á¹û¡£ÀýÈ磬һ¸öÏß³ÌÕýÔÚ¸üÐÂÒ»¸ö½á¹¹µÄÄÚÈݵÄͬʱÁíÒ»¸öÏß³ÌÕýÊÔͼ¶Áȡͬһ¸ö½á¹¹¡£½á¹û£¬ÎÒÃǽ«ÎÞ·¨µÃÖªËù¶ÁÈ¡µÄÊý¾ÝÊÇʲô״̬£º¾ÉÊý¾Ý£¬ÐÂÊý¾Ý£¬»¹ÊǶþÕߵĻìºÏ£¿

---- MFC ÌṩÁËÒ»×éͬ²½ºÍͬ²½·ÃÎÊÀàÀ´½â¾öÕâ¸öÎÊÌ⣬°üÀ¨£º

---- ͬ²½¶ÔÏó£ºCSyncObject, CSemaphore, CMutex, CcriticalSection ºÍCEvent £»Í¬²½·ÃÎʶÔÏó£ºCMultiLock ºÍCSingleLock ¡£

---- ͬ²½ÀàÓÃÓÚµ±·ÃÎÊ×ÊԴʱ±£Ö¤×ÊÔ´µÄÕûÌåÐÔ¡£ÆäÖÐCsyncObject ÊÇÆäËüËĸöͬ²½ÀàµÄ»ùÀ࣬²»Ö±½ÓʹÓá£ÐźÅͬ²½ÀàCSemaphore ͨ³£ÓÃÓÚµ±Ò»¸öÓ¦ÓóÌÐòÖÐͬʱÓжà¸öÏ̷߳ÃÎÊÒ»¸ö×ÊÔ´£¨ÀýÈ磬ӦÓóÌÐòÔÊÐí¶Ôͬһ¸öDocument Óжà¸öView£©µÄÇé¿ö£»Ê¼þͬ²½ÀàCEvent ͨ³£ÓÃÓÚÔÚÓ¦ÓóÌÐò·ÃÎÊ×ÊԴ֮ǰӦÓóÌÐò±ØÐëµÈ´ý£¨±ÈÈ磬ÔÚÊý¾Ýд½øÒ»¸öÎļþ֮ǰÊý¾Ý±ØÐë´ÓͨÐŶ˿ڵõ½£©µÄÇé¿ö£»¶ø¶ÔÓÚ»¥³âͬ²½ÀàCMutex ºÍÁÙ½çÇøÍ¬²½ÀàCcriticalSection ¶¼ÊÇÓÃÓÚ±£Ö¤Ò»¸ö×ÊÔ´Ò»´ÎÖ»ÄÜÓÐÒ»¸öÏ̷߳ÃÎÊ£¬¶þÕߵIJ»Í¬Ö®´¦ÔÚÓÚǰÕßÔÊÐíÓжà¸öÓ¦ÓóÌÐòʹÓøÃ×ÊÔ´£¨ÀýÈ磬¸Ã×ÊÔ´ÔÚÒ»¸öDLL µ±ÖУ©¶øºóÕßÔò²»ÔÊÐí¶Ôͬһ¸ö×ÊÔ´µÄ·ÃÎʳ¬³ö½ø³ÌµÄ·¶³ë£¬¶øÇÒʹÓÃÁÙ½çÇøµÄ·½Ê½Ð§ÂʱȽϸߡ£

---- ͬ²½·ÃÎÊÀàÓÃÓÚ»ñµÃ¶ÔÕâЩ¿ØÖÆ×ÊÔ´µÄ·ÃÎÊ¡£CMultiLock ºÍCSingleLock µÄÇø±ð½öÔÚÓÚÊÇÐèÒª¿ØÖÆ·ÃÎʶà¸ö»¹Êǵ¥¸ö×ÊÔ´¶ÔÏó¡£

---- 5 ͬ²½ÀàµÄʹÓ÷½·¨

---- ½â¾öͬ²½ÎÊÌâµÄÒ»¸ö¼òµ¥µÄ·½·¨¾ÍÊǽ«Í¬²½ÀàÈÚÈë¹²ÏíÀ൱ÖУ¬Í¨³£ÎÒÃǰÑÕâÑùµÄ¹²ÏíÀà³ÆÎªḬ̈߳²È«Àà¡£ÏÂÃæ¾ÙÀýÀ´ËµÃ÷ÕâЩͬ²½ÀàµÄʹÓ÷½·¨¡£±ÈÈ磬һ¸öÓÃÒÔά»¤Ò»¸öÕÊ»§µÄÁ¬½ÓÁбíµÄÓ¦ÓóÌÐò¡£¸ÃÓ¦ÓóÌÐòÔÊÐí3 ¸öÕÊ»§ÔÚ²»Í¬µÄ´°¿ÚÖмì²â£¬µ«Ò»´ÎÖ»ÄܸüÐÂÒ»¸öÕÊ»§¡£µ±Ò»¸öÕÊ»§¸üÐÂÖ®ºó£¬ÐèÒª½«¸üеÄÊý¾Ýͨ¹ýÍøÂç´«¸øÒ»¸öÊý¾ÝÎĵµ¡£

---- ¸ÃÀýÖн«Ê¹ÓÃ3 ÖÖͬ²½Àà¡£ÓÉÓÚÔÊÐíÒ»´Î¼ì²â3 ¸öÕÊ»§£¬Ê¹ÓÃCSemaphore À´ÏÞÖÆ¶Ô3 ¸öÊÓ´°¶ÔÏóµÄ·ÃÎÊ¡£µ±¸üÐÂÒ»¸öÕÊĿʱ£¬Ó¦ÓóÌÐòʹÓÃCCriticalSection À´±£Ö¤Ò»´ÎÖ»ÓÐÒ»¸öÕÊÄ¿¸üС£ÔÚ¸üгɹ¦Ö®ºó£¬·¢CEvent Ðźţ¬¸ÃÐźÅÊÍ·ÅÒ»¸öµÈ´ý½ÓÊÕÐźÅʼþµÄÏ̡߳£¸ÃÏ߳̽«ÐÂÊý¾Ý´«¸øÊý¾ÝÎĵµ¡£

---- ÒªÉè¼ÆÒ»¸öḬ̈߳²È«À࣬Ê×Ïȸù¾Ý¾ßÌåÇé¿öÔÚÀàÖмÓÈëͬ²½Àà×öΪÊý¾Ý³ÉÔ±¡£ÔÚÀý×Óµ±ÖУ¬¿ÉÒÔ½«Ò»¸öCSemaphore ÀàµÄÊý¾Ý³ÉÔ±¼ÓÈëÊÓ´°ÀàÖУ¬Ò»¸öCCriticalSection ÀàÊý¾Ý³ÉÔ±¼ÓÈëÁ¬½ÓÁбíÀ࣬¶øÒ»¸öCEvent Êý¾Ý³ÉÔ±¼ÓÈëÊý¾Ý´æ´¢ÀàÖС£

---- È»ºó£¬ÔÚʹÓù²Ïí×ÊÔ´µÄº¯Êýµ±ÖУ¬½«Í¬²½ÀàÓëͬ²½·ÃÎÊÀàµÄÒ»¸öËø¶ÔÏóÁªÏµÆðÀ´¡£¼´£¬ÔÚ·ÃÎÊ¿ØÖÆ×ÊÔ´µÄ³ÉÔ±º¯ÊýÖÐÓ¦¸Ã´´½¨Ò»¸öCSingleLock »òCMultiLock µÄ¶ÔÏó²¢µ÷ÓøöÔÏóµÄLock º¯Êý¡£µ±·ÃÎʽáÊøÖ®ºó£¬µ÷ÓÃUnLock º¯Êý£¬ÊÍ·Å×ÊÔ´¡£

---- ÓÃÕâÖÖ·½Ê½À´Éè¼ÆḬ̈߳²È«Àà±È½ÏÈÝÒס£ÔÚ±£Ö¤Ḭ̈߳²È«µÄͬʱ£¬Ê¡È¥ÁËά»¤Í¬²½´úÂëµÄÂé·³£¬ÕâÒ²ÕýÊÇOOP µÄ˼Ïë¡£µ«ÊÇʹÓÃḬ̈߳²È«Àà·½·¨±à³Ì±È²»¿¼ÂÇḬ̈߳²È«Òª¸´ÔÓ£¬ÓÈÆäÌåÏÖÔÚ³ÌÐòµ÷ÊÔ¹ý³ÌÖС£¶øÇÒḬ̈߳²È«±à³Ì»¹»áËðʧһ²¿·ÖЧÂÊ£¬±ÈÈçÔÚµ¥CPU ¼ÆËã»úÖжà¸öÏß³ÌÖ®¼äµÄÇл»»áÕ¼ÓÃÒ»²¿·Ö×ÊÔ´¡£

Èý±à³ÌʵÀý
---- ÏÂÃæÒÔVC++5.0 ÖÐÒ»¸ö¼òµ¥µÄ»ùÓÚ¶Ô»°¿òµÄMFC Àý³ÌÀ´ËµÃ÷ʵÏÖ¶àÏß³ÌÈÎÎñµ÷¶ÈÓë´¦ÀíµÄ·½·¨£¬ÏÂÃæ¼ÓÒÔÏêϸ½âÊÍ¡£
---- ÔÚ¸ÃÀý³Ìµ±Öж¨ÒåÁ½¸öÓû§½çÃæỊ̈߳¬Ò»¸öÏÔʾÏß³Ì(CDisplayThread) ºÍÒ»¸ö¼ÆÊýÏß³Ì(CCounterThread)¡£ÕâÁ½¸öÏß³Ìͬʱ²Ù×÷Ò»¸ö×Ö·û´®±äÁ¿m_strNumber£¬ÆäÖÐÏÔʾÏ߳̽«¸Ã×Ö·û´®ÔÚÒ»¸öÁбí¿òÖÐÏÔʾ£¬¶ø¼ÆÊýÏß³ÌÔò½«¸Ã×Ö·û´®ÖеÄÕûÊý¼Ó1¡£ÔÚÀý³ÌÖУ¬¿ÉÒÔ·Ö±ðµ÷Õû½ø³Ì¡¢¼ÆÊýÏ̺߳ÍÏÔʾÏ̵߳ÄÓÅÏȼ¶¡£Àý³ÌÖеÄͬ²½»úÖÆÊ¹ÓÃCMutex ºÍCSingleLock À´±£Ö¤Á½¸öÏ̲߳»ÄÜͬʱ·ÃÎʸÃ×Ö·û´®¡£Í¬²½»úÖÆÖ´ÐÐÓë·ñ½«Ã÷ÏÔÓ°Ïì³ÌÐòµÄÖ´Ðнá¹û¡£ÔÚ¸ÃÀý³ÌÖÐÔÊÐí½«½«°ÑÁ½¸öÏß³ÌÔÝʱ¹ÒÆð£¬ÒԲ鿴ÔËÐнá¹û¡£Àý³ÌÖл¹ÔÊÐí²é¿´¼ÆÊýÏ̵߳ÄÔËÐС£¸ÃÀý³ÌÖÐËù´¦ÀíµÄÎÊÌâÒ²ÊǶàÏ̱߳à³ÌÖзdz£¾ßÓеäÐÍÒâÒåµÄÎÊÌâ¡£

---- ÔڸóÌÐòÖ´ÐÐʱÖ÷ÒªÓÐÈý¸öÓÃÓÚµ÷ÕûÓÅÏȼ¶µÄ×éºÏ¿ò£¬Èý¸ö·Ö±ðÓÃÓÚÑ¡Ôñͬ²½»úÖÆ¡¢ÏÔʾ¼ÆÊýÏß³ÌÔËÐÐºÍ¹ÒÆðÏ̵߳ĸ´Ñ¡¿òÒÔ¼°Ò»¸öÓÃÓÚÏÔʾÔËÐнá¹ûµÄÁбí¿ò¡£

---- ÔÚ±¾³ÌÐòÖÐʹÓÃÁËÁ½¸öÏß³ÌÀàCCounterThread ºÍCDisplayThread£¬ÕâÁ½¸öÏß³ÌÀ๲ͬ²Ù×÷¶¨ÒåÔÚCMutexesDlg ÖеÄ×Ö·û´®¶ÔÏóm_strNumber¡£±¾³ÌÐò¶Ôͬ²½ÀàCMutex µÄʹÓ÷½·¨¾ÍÊǰ´ÕÕ±¾ÎÄËù½²ÊöµÄÈÚÈëµÄ·½·¨À´ÊµÏֵġ£Í¬²½·ÃÎÊÀàCSingleLock µÄËø¶ÔÏóÔòÔÚ¸÷Ï̵߳ľßÌåʵÏÖÖж¨Òå¡£

---- ÏÂÃæ½éÉܸÃÀý³ÌµÄ¾ßÌåʵÏÖ£º

ÀûÓÃAppWizard Éú³ÉÒ»¸öÃûΪMutexes »ùÓÚ¶Ô»°¿òµÄÓ¦ÓóÌÐò¿ò¼Ü¡£

ÀûÓöԻ°¿ò±à¼­Æ÷ÔÚ¶Ô»°¿òÖÐÌî¼ÓÒÔÏÂÄÚÈÝ£ºÈý¸ö×éºÏ¿ò£¬Èý¸ö¸´Ñ¡¿òºÍÒ»¸öÁбí¿ò¡£Èý¸ö×éºÏ¿ò·Ö±ðÔÊÐí¸Ä±ä½ø³ÌÓÅÏȼ¶ºÍÁ½¸öÏß³ÌÓÅÏȼ¶£¬ÆäID ·Ö±ðÉèÖÃΪ£ºIDC_PRIORITYCLASS¡¢IDC_DSPYTHRDPRIORITY ºÍIDC_CNTRTHRDPRIORITY¡£Èý¸ö¸´Ñ¡¿ò·Ö±ð¶ÔÓ¦×Åͬ²½»úÖÆÑ¡Ïî¡¢ÏÔʾ¼ÆÊýÏß³ÌÖ´ÐÐÑ¡ÏîºÍÔÝͣѡÏÆäID ·Ö±ðÉèÖÃΪIDC_SYNCHRONIZE¡¢IDC_SHOWCNTRTHRD ºÍIDC_PAUSE¡£Áбí¿òÓÃÓÚÏÔʾÏß³ÌÏÔʾ³ÌÐòÖÐÁ½¸öÏ̵߳Ĺ²Í¬²Ù×÷¶ÔÏóm_strNumber£¬ÆäID ÉèÖÃΪIDC_DATABOX¡£

´´½¨ÀàCWinThread µÄÅÉÉúÀàCExampleThread¡£¸ÃÀཫ×÷Ϊ±¾³ÌÐòÖÐʹÓõÄÁ½¸öÏß³ÌÀࣺCCounterThread ºÍCDisplayThread µÄ¸¸Àà¡£ÕâÑù×öµÄÄ¿µÄ½öÊÇΪÁ˹²ÏíÁ½¸öÏß³ÌÀàµÄ¹²ÓñäÁ¿ºÍº¯Êý¡£
---- ÔÚCExampleThread µÄÍ·ÎļþÖÐÌî¼ÓÈçϱäÁ¿£º
    CMutexesDlg * m_pOwner;//Ö¸ÏòÀàCMutexesDlgÖ¸Õë
        BOOL m_bDone;//ÓÃÒÔ¿ØÖÆÏß³ÌÖ´ÐÐ
¼°º¯Êý£º
    void SetOwner(CMutexesDlg* pOwner)
{ m_pOwner=pOwner; };//È¡ÀàCMutexesDlgµÄÖ¸Õë
    È»ºóÔÚ¹¹Ô캯Êýµ±ÖжԳÉÔ±±äÁ¿½øÐгõʼ»¯£º
        m_bDone=FALSE;//³õʼ»¯ÔÊÐíÏß³ÌÔËÐÐ
        m_pOwner=NULL;//½«¸ÃÖ¸ÕëÖÃΪ¿Õ
        m_bAutoDelete=FALSE;//ÒªÇóÊÖ¶¯É¾³ýÏ̶߳ÔÏó
´´½¨Á½¸öÏß³ÌÀàCCounterThread ºÍCdisplayThread¡£ÕâÁ½¸öÏß³ÌÀàÊÇCExampleThread µÄÅÉÉúÀà¡£·Ö±ðÖØÔØÁ½¸öÏ̺߳¯ÊýÖеÄ::Run() º¯Êý£¬ÊµÏÖ¸÷Ï̵߳ÄÈÎÎñ¡£ÔÚÕâÁ½¸öÀ൱Öзֱð¼ÓÈëͬ²½·ÃÎÊÀàµÄËø¶ÔÏósLock£¬ÕâÀォ¸ù¾Ýͬ²½»úÖÆµÄ¸´Ñ¡Óë·ñÀ´È·¶¨ÊÇ·ñ¿ØÖƶԹ²Ïí×ÊÔ´µÄ·ÃÎÊ¡£²»ÒªÍü¼ÇÐèÒª¼ÓÈëÍ·Îļþ#include "afxmt.h"¡£
---- ¼ÆÊýÏß³Ì::Run() º¯ÊýµÄÖØÔØ´úÂëΪ£º
int CCounterThread::Run()
{
    BOOL fSyncChecked;//ͬ²½»úÖÆ¸´Ñ¡¼ì²â
    unsigned int nNumber;//´æ´¢×Ö·û´®ÖÐÕûÊý

    if (m_pOwner == NULL)
        return -1;
    //½«Í¬²½¶ÔÏóÍ¬Ëø¶ÔÏóÁªÏµÆðÀ´
CSingleLock sLock(&(m_pOwner- >m_mutex));
    while (!m_bDone)//¿ØÖÆÏß³ÌÔËÐУ¬ÎªÖÕÖ¹Ï̷߳þÎñ
    {
    //ȡͬ²½»úÖÆ¸´Ñ¡×´Ì¬
fSyncChecked = m_pOwner- >
IsDlgButtonChecked(IDC_SYNCHRONIZE);
    //È·¶¨ÊÇ·ñʹÓÃͬ²½»úÖÆ
    if (fSyncChecked)
        sLock.Lock();
    //¶ÁÈ¡ÕûÊý
_stscanf((LPCTSTR) m_pOwner- >m_strNumber,
_T("%d"), &nNumber);
    nNumber++;//¼Ó1
    m_pOwner- >m_strNumber.Empty();//×Ö·û´®ÖÿÕ
    while (nNumber != 0) //¸üÐÂ×Ö·û´®
    {
m_pOwner- >m_strNumber +=
(TCHAR) (0+nNumber%10);
nNumber /= 10;
    }
    //µ÷Õû×Ö·û´®Ë³Ðò
    m_pOwner- >m_strNumber.MakeReverse();
    //Èç¹û¸´Ñ¡Í¬²½»úÖÆ£¬ÊÍ·Å×ÊÔ´
    if (fSyncChecked)
        sLock.Unlock();
    //È·¶¨¸´Ñ¡ÏÔʾ¼ÆÊýÏß³Ì
    if (m_pOwner- >IsDlgButtonChecked(IDC_SHOWCNTRTHRD))
        m_pOwner- >AddToListBox(_T("Counter: Add 1"));
    }//½áÊøwhile

    m_pOwner- >PostMessage(WM_CLOSE, 0, 0L);
    return 0;
}
ÏÔʾÏ̵߳Ä::Run()º¯ÊýÖØÔØ´úÂëΪ£º
int CDisplayThread::Run()
{
    BOOL fSyncChecked;
    CString strBuffer;

    ASSERT(m_pOwner != NULL);
    if (m_pOwner == NULL)
        return -1;
    CSingleLock sLock(&(m_pOwner- >m_mutex));
    while (!m_bDone)
    {
fSyncChecked = m_pOwner- >
IsDlgButtonChecked(IDC_SYNCHRONIZE);
    if (fSyncChecked)
        sLock.Lock();
    //¹¹½¨ÒªÏÔʾµÄ×Ö·û´®
    strBuffer = _T("Display: ");
    strBuffer += m_pOwner- >m_strNumber;
    if (fSyncChecked)
        sLock.Unlock();
    //½«×Ö·û´®¼ÓÈëµ½Áбí¿òÖÐ
    m_pOwner- >AddToListBox(strBuffer);
    }//½áÊøwhile
    m_pOwner- >PostMessage(WM_CLOSE, 0, 0L);
    return 0;
}

3ÔÚCMutexesDlgµÄÍ·ÎļþÖмÓÈëÈçϳÉÔ±±äÁ¿£º
        CString m_strNumber;//Ïß³ÌËùÒª²Ù×÷µÄ×ÊÔ´¶ÔÏó
        CMutex m_mutex;//ÓÃÓÚͬ²½»úÖÆµÄ»¥³âÁ¿
        CCounterThread* m_pCounterThread;//Ö¸Ïò¼ÆÊýÏ̵߳ÄÖ¸Õë
        CDisplayThread* m_pDisplayThread;//Ö¸ÏòÏÔʾÏ̵߳ÄÖ¸Õë
    Ê×ÏÈÔÚ¶Ô»°¿òµÄ³õʼ»¯º¯ÊýÖмÓÈëÈçÏ´úÂë¶Ô¶Ô»°¿ò½øÐгõʼ»¯£º
    BOOL CMutexesDlg::OnInitDialog()
{
    ¡­¡­
    //³õʼ»¯½ø³ÌÓÅÏȼ¶×éºÏ¿ò²¢ÖÃȱʡΪNORMAL
    CComboBox* pBox;
    pBox = (CComboBox*) GetDlgItem(IDC_PRIORITYCLASS);
    ASSERT(pBox != NULL);
    if (pBox != NULL){
        pBox- >AddString(_T("Idle"));
        pBox- >AddString(_T("Normal"));
        pBox- >AddString(_T("High"));
        pBox- >AddString(_T("Realtime"));
        pBox- >SetCurSel(1);
    }
    //³õʼ»¯ÏÔʾÏß³ÌÓÅÏȼ¶×éºÏ¿ò²¢ÖÃȱʡΪNORMAL
pBox = (CComboBox*) GetDlgItem(IDC_DSPYTHRDPRIORITY);
    ASSERT(pBox != NULL);
    if (pBox != NULL){
    pBox- >AddString(_T("Idle"));
    pBox- >AddString(_T("Lowest"));
    pBox- >AddString(_T("Below normal"));
    pBox- >AddString(_T("Normal"));
    pBox- >AddString(_T("Above normal"));
    pBox- >AddString(_T("Highest"));
    pBox- >AddString(_T("Timecritical"));
    pBox- >SetCurSel(3);
    }
    //³õʼ»¯¼ÆÊýÏß³ÌÓÅÏȼ¶×éºÏ¿ò²¢ÖÃȱʡΪNORMAL
pBox = (CComboBox*) GetDlgItem(IDC_CNTRTHRDPRIORITY);
    ASSERT(pBox != NULL);
    if (pBox != NULL){
        pBox- >AddString(_T("Idle"));
        pBox- >AddString(_T("Lowest"));
        pBox- >AddString(_T("Below normal"));
        pBox- >AddString(_T("Normal"));
        pBox- >AddString(_T("Above normal"));
        pBox- >AddString(_T("Highest"));
        pBox- >AddString(_T("Timecritical"));
        pBox- >SetCurSel(3);
    }
    //³õʼ»¯Ïß³Ì¹ÒÆð¸´Ñ¡¿òΪ¹ÒÆð״̬
    CButton* pCheck = (CButton*) GetDlgItem(IDC_PAUSE);
    pCheck- >SetCheck(1);
    //³õʼ»¯Ïß³Ì
    m_pDisplayThread = (CDisplayThread*)
        AfxBeginThread(RUNTIME_CLASS(CDisplayThread),
                    THREAD_PRIORITY_NORMAL,
                    0,
                    CREATE_SUSPENDED);
    m_pDisplayThread- >SetOwner(this);

    m_pCounterThread = (CCounterThread*)
        AfxBeginThread(RUNTIME_CLASS(CCounterThread),
                    THREAD_PRIORITY_NORMAL,
                    0,
                    CREATE_SUSPENDED);
    m_pCounterThread- >SetOwner(this);
    ¡­¡­
}
    È»ºóÌî¼Ó³ÉÔ±º¯Êý£º
    void AddToListBox(LPCTSTR szBuffer);//ÓÃÓÚÌî¼ÓÁбí¿òÏÔʾ
    ¸Ãº¯ÊýµÄʵÏÖ´úÂëΪ£º
void CMutexesDlg::AddToListBox(LPCTSTR szBuffer)
{
    CListBox* pBox = (CListBox*) GetDlgItem(IDC_DATABOX);
    ASSERT(pBox != NULL);
    if (pBox != NULL){
        int x = pBox- >AddString(szBuffer);
        pBox- >SetCurSel(x);
        if (pBox- >GetCount() > 100)
            pBox- >DeleteString(0);
    }
}
---- È»ºóÀûÓÃClassWizard Ìî¼ÓÓÃÓÚµ÷Õû½ø³ÌÓÅÏȼ¶¡¢Á½¸öÏß³ÌÓÅÏȼ¶ÒÔ¼°ÓÃÓÚ¸´Ñ¡Ïß³Ì¹ÒÆðµÄº¯Êý¡£
---- µ÷Õû½ø³ÌÓÅÏȼ¶µÄ´úÂëΪ£º

    void CMutexesDlg::OnSelchangePriorityclass()
{
    DWORD dw;
    //È¡½¹µãÑ¡Ïî
CComboBox* pBox = (CComboBox*)
GetDlgItem(IDC_PRIORITYCLASS);
    int nCurSel = pBox- >GetCurSel();
    switch (nCurSel)
    {
    case 0:
        dw = IDLE_PRIORITY_CLASS;break;
    case 1:
    default:
        dw = NORMAL_PRIORITY_CLASS;break;
    case 2:
        dw = HIGH_PRIORITY_CLASS;break;
    case 3:
        dw = REALTIME_PRIORITY_CLASS;break;
    }
    SetPriorityClass(GetCurrentProcess(), dw);//µ÷ÕûÓÅÏȼ¶
}
---- ÓÉÓÚµ÷ÕûÁ½¸öÏß³ÌÓÅÏȼ¶µÄ´úÂë»ù±¾ÏàËÆ£¬µ¥¶ÀÉèÖÃÒ»¸öº¯Êý¸ù¾Ý²»Í¬µÄID À´µ÷ÕûÏß³ÌÓÅÏȼ¶¡£¸Ãº¯Êý´úÂëΪ£º
void CMutexesDlg::OnPriorityChange(UINT nID)
{
    ASSERT(nID == IDC_CNTRTHRDPRIORITY ||
        nID == IDC_DSPYTHRDPRIORITY);
    DWORD dw;
    //È¡¶ÔÓ¦¸ÃIDµÄ½¹µãÑ¡Ïî
    CComboBox* pBox = (CComboBox*) GetDlgItem(nID);
    int nCurSel = pBox- >GetCurSel();
    switch (nCurSel)
    {
    case 0:
        dw = (DWORD)THREAD_PRIORITY_IDLE;break;
    case 1:
        dw = (DWORD)THREAD_PRIORITY_LOWEST;break;
    case 2:
dw = (DWORD)THREAD_PRIORITY_BELOW_NORMAL;break;
    case 3:
    default:
        dw = (DWORD)THREAD_PRIORITY_NORMAL;break;
    case 4:
dw = (DWORD)THREAD_PRIORITY_ABOVE_NORMAL;break;
    case 5:
        dw = (DWORD)THREAD_PRIORITY_HIGHEST;break;
    case 6:
        dw = (DWORD)THREAD_PRIORITY_TIME_CRITICAL;break;
    }
    if (nID == IDC_CNTRTHRDPRIORITY)
        m_pCounterThread- >SetThreadPriority(dw);
//µ÷Õû¼ÆÊýÏß³ÌÓÅÏȼ¶
    else
        m_pDisplayThread- >SetThreadPriority(dw);
//µ÷ÕûÏÔʾÏß³ÌÓÅÏȼ¶
}
    ÕâÑùÏß³ÌÓÅÏȼ¶µÄµ÷ÕûÖ»ÐèÒª¸ù¾Ý²»Í¬µÄIDÀ´µ÷Óøú¯Êý£º
void CMutexesDlg::OnSelchangeDspythrdpriority()
{ OnPriorityChange(IDC_DSPYTHRDPRIORITY);}
void CMutexesDlg::OnSelchangeCntrthrdpriority()
{ OnPriorityChange(IDC_CNTRTHRDPRIORITY);}
    ¸´Ñ¡Ïß³Ì¹ÒÆðµÄʵÏÖ´úÂëÈçÏ£º
void CMutexesDlg::OnPause()
{
    //È¡¹ÒÆð¸´Ñ¡¿ò״̬
    CButton* pCheck = (CButton*)GetDlgItem(IDC_PAUSE);
    BOOL bPaused = ((pCheck- >GetState() & 0x003) != 0);
    if (bPaused)    {
        m_pCounterThread- >SuspendThread();
        m_pDisplayThread- >SuspendThread();
    }//¹ÒÆðÏß³Ì
    else    {
        m_pCounterThread- >ResumeThread();
        m_pDisplayThread- >ResumeThread();
    }//»Ö¸´Ïß³ÌÔËÐÐ
}
---- ³ÌÐòÔÚ::OnClose() ÖÐʵÏÖÁËÏ̵߳ÄÖÕÖ¹¡£ÔÚ±¾Àý³Ìµ±ÖжÔÏ̵߳ÄÖÕÖ¹ÉÔ΢¸´ÔÓЩ¡£ÐèҪעÒâµÄÊdzÉÔ±±äÁ¿m_bDone µÄ×÷Óã¬ÔÚÏ̵߳ÄÔËÐе±ÖÐÑ­»·¼ì²â¸Ã±äÁ¿µÄ״̬£¬×îÖÕÒýÆðÏ̵߳ÄÍ˳ö¡£ÕâÑùÏ̵߳ÄÖÕÖ¹ÊÇÒòΪº¯ÊýµÄÍ˳ö¶ø×ÔÈ»ÖÕÖ¹£¬¶ø·Ç²ÉÓÃÇ¿ÐÐÖÕÖ¹µÄ·½·¨£¬ÕâÑùÓÐÀûÓÚϵͳµÄ°²È«¡£¸Ã³ÌÐòÖÐʹÓÃÁËPostMessage º¯Êý£¬¸Ãº¯Êý·¢ËÍÏûÏ¢ºóÁ¢¼´·µ»Ø£¬ÕâÑù¿ÉÒÔ±ÜÃâ×èÈû¡£ÆäʵÏֵĴúÂëΪ£º
    void CMutexesDlg::OnClose()
{
    int nCount = 0;
    DWORD dwStatus;
    //È¡¹ÒÆð¸´Ñ¡¿ò״̬
    CButton* pCheck = (CButton*) GetDlgItem(IDC_PAUSE);
    BOOL bPaused = ((pCheck- >GetState() & 0x003) != 0);
   
if (bPaused == TRUE){
        pCheck- >SetCheck(0);//¸´Ñ¡È¡Ïû
        m_pCounterThread- >ResumeThread();
//»Ö¸´Ïß³ÌÔËÐÐ
        m_pDisplayThread- >ResumeThread();
    }

    if (m_pCounterThread != NULL){
VERIFY(::GetExitCodeThread(m_pCounterThread- >
m_hThread, &dwStatus));//È¡¼ÆÊýÏ߳̽áÊøÂë
        if (dwStatus == STILL_ACTIVE){
            nCount++;
            m_pCounterThread- >m_bDone = TRUE;
        }//Èç¹ûÈÔΪÔËÐÐ״̬£¬ÔòÖÕÖ¹
        else{
            delete m_pCounterThread;
            m_pCounterThread = NULL;
        }//Èç¹ûÒѾ­ÖÕÖ¹£¬Ôòɾ³ý¸ÃÏ̶߳ÔÏó
    }
   
    if (m_pDisplayThread != NULL){
VERIFY(::GetExitCodeThread(m_pDisplayThread- >
m_hThread, &dwStatus));//È¡ÏÔʾÏ߳̽áÊøÂë
        if (dwStatus == STILL_ACTIVE){
            nCount++;
            m_pDisplayThread- >m_bDone = TRUE;
        }//Èç¹ûÈÔΪÔËÐÐ״̬£¬ÔòÖÕÖ¹
        else{
            delete m_pDisplayThread;
            m_pDisplayThread = NULL;
        }//Èç¹ûÒѾ­ÖÕÖ¹£¬Ôòɾ³ý¸ÃÏ̶߳ÔÏó
    }
    if (nCount == 0)//Á½¸öÏ߳̾ùÖÕÖ¹£¬Ôò¹Ø±Õ³ÌÐò
CDialog::OnClose();
    else //·ñÔò·¢ËÍWM_CLOSEÏûÏ¢
PostMessage(WM_CLOSE, 0, 0);
}
---- ÔÚÀý³Ì¾ßÌåʵÏÖÖÐÓõ½ÁËÐí¶àº¯Êý£¬ÔÚÕâÀﲻһһ׸Êö£¬¹ØÓÚº¯ÊýµÄ¾ßÌåÒâÒåºÍÓ÷¨£¬¿ÉÒÔ²éÔÄÁª»ú°ïÖú¡£


¡¾·¢±íÆÀÂÛ¡¿¡¾¹Ø±Õ´°¿Ú¡¿