• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 131, comments - 12, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            MFC啟動和關閉線程

            Posted on 2013-01-15 11:00 盛勝 閱讀(9827) 評論(0)  編輯 收藏 引用

            http://hi.baidu.com/andywangcn/item/50d640c325290a2aef4665c4
            1、 啟動線程:

            CWinThread* AfxBeginThread( 線程函數(shù),this );

            2、通常導致線程終止的兩種情況是:控制函數(shù)退出或不允許線程完成運行。如果字處理器使用后臺打印線程,若成功完成打印,則控制函數(shù)將正常終止。但是,如果用戶要取消打印,后臺打印線程則不得不提前終止。本主題介紹如何實現(xiàn)每一種情況,以及在終止后如何獲取線程的退出代碼。

            (1)正常線程終止

            對于輔助線程,正常線程終止很簡單:退出控制函數(shù)并返回表示終止原因的值。可以使用 函數(shù)或 return 語句。一般情況下,0 表示成功完成,但這取決于您自己。

            對于用戶界面線程,該過程也很簡單:從用戶界面線程內調用 Platform SDK 中的 。PostQuitMessage 采用的唯一參數(shù)是線程的退出代碼。對于輔助線程,0 通常表示成功完成。

            (2)過早的線程終止

            過早終止線程幾乎一樣簡單:從線程內調用 。將所需的退出代碼作為唯一參數(shù)傳遞。這將停止執(zhí)行線程、解除對線程堆棧的分配、分離附加到線程的所有 DLL 并從內存中刪除線程對象。

            必須從要終止的線程內調用 AfxEndThread。如果要從其他線程終止線程,必須設置兩個線程間的通信方法。

            舉一個例子:

            可以創(chuàng)建一個信號量,用WaitForSingleObject函數(shù)來檢測該信號量的狀態(tài)。

            成員變量 m_hThreadEvent;

            m_hThreadEvent = CreateEvent( NULL, FALSE, FALSE, NULL );

            線程的執(zhí)行函數(shù):

                     for ( ; ; )

                     {         DWORD dwRetVal;

                               dwRetVal = WaitForSingleObject( m_hThreadEvent, 100 );

                               if ( dwRetVal == WAIT_TIMEOUT )

                                    {                    // TODO:

                               }

                               else

                               {

                                        // stop receive text thread.

                                        DWORD dwExitCode;

                                        GetExitCodeThread( m_pThreadRecv->m_hThread, &dwExitCode );

                                        AfxEndThread( dwExitCode, TRUE );

                               }

                     }

                要結束線程時,使用SetEvent,將信號量置為有信號。

                該線程是在信號量有信號時,退出。

            (3)TerminateThread

            在CWinThread對象中有線程的句柄,可以使用該句柄強行殺死線程。但是不推薦使用這種方式,當可以正常結束的時候,選擇前兩種方法較好。

            檢索線程的退出代碼

            若要獲取輔助線程或用戶界面線程的退出代碼,請調用 函數(shù)。有關此函數(shù)的信息,請參見 Platform SDK。此函數(shù)獲取線程(存儲在 CWinThread 對象的 m_hThread 數(shù)據(jù)成員中)的句柄和 DWORD 的地址。

            如果線程仍然是活動的,GetExitCodeThread 將 STILL_ACTIVE 放置在提供的 DWORD 地址中;否則將退出代碼放置在該地址中。

            檢索 對象的退出代碼還需要一步。默認情況下,當 CWinThread 線程終止時,刪除該線程對象。這意味著不能訪問 m_hThread 數(shù)據(jù)成員,因為 CWinThread 對象不再存在。若要避免出現(xiàn)這種情況,請執(zhí)行以下操作之一:

            • 將 m_bAutoDelete 數(shù)據(jù)成員設置為 FALSE。這使 CWinThread 對象在線程終止后仍可以繼續(xù)存在。然后可以在線程終止后,訪問 m_hThread 數(shù)據(jù)成員。但是,如果使用此方法,就得銷毀 CWinThread 對象,因為框架不會自動刪除該對象。這是首選方法。

            • 單獨存儲線程的句柄。創(chuàng)建線程后,(使用 ::DuplicateHandle)將其 m_hThread 數(shù)據(jù)成員復制到其他變量,并通過該變量訪問該成員。這樣,終止后即會自動刪除對象,并且仍然可以找到線程終止的原因。請注意:在可以復制句柄之前,線程不終止。執(zhí)行此操作的最安全的方式是將 CREATE_SUSPENDED 傳遞到 ,存儲句柄,然后通過調用 繼續(xù)執(zhí)行線程。

            任一方法都可以使您確定 CWinThread 對象終止的原因。

            久久综合九色综合久99| 久久婷婷五月综合成人D啪| 久久久久久久波多野结衣高潮| 久久婷婷人人澡人人爽人人爱 | 精品久久久久久中文字幕大豆网| 久久精品人人槡人妻人人玩AV | 国产99久久久久久免费看| 久久99精品国产麻豆蜜芽| 久久人人爽人人爽人人片AV不| 久久久无码精品亚洲日韩按摩| 色综合色天天久久婷婷基地| 人妻精品久久久久中文字幕 | 久久综合久久综合九色| 久久综合欧美成人| 精品伊人久久久| 国产亚州精品女人久久久久久 | 国产精品成人精品久久久 | 久久毛片一区二区| .精品久久久麻豆国产精品| 性做久久久久久久久老女人| 国产日产久久高清欧美一区| 一极黄色视频久久网站| 亚洲综合婷婷久久| 91久久婷婷国产综合精品青草 | 国产精品久久久久a影院| 色综合久久综精品| 2021精品国产综合久久| 亚洲级αV无码毛片久久精品| 久久久久97国产精华液好用吗| 国产精品久久久久影院嫩草| 人人狠狠综合久久88成人| 久久大香萑太香蕉av| 一本大道久久香蕉成人网| 久久久久国色AV免费观看| 日本精品久久久久中文字幕8| 亚洲中文字幕无码久久精品1| 久久久久久久久66精品片| 久久受www免费人成_看片中文| 色综合久久中文字幕综合网| 亚洲精品第一综合99久久| 一97日本道伊人久久综合影院|