日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MFC启动和关闭线程

發布時間:2023/12/18 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC启动和关闭线程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://hi.baidu.com/andywangcn/item/50d640c325290a2aef4665c4

1、?啟動線程:

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

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

(1)正常線程終止

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

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

(2)過早的線程終止

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

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

舉一個例子:

可以創建一個信號量,用WaitForSingleObject函數來檢測該信號量的狀態。

成員變量 m_hThreadEvent;

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

線程的執行函數:

???????? 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對象中有線程的句柄,可以使用該句柄強行殺死線程。但是不推薦使用這種方式,當可以正常結束的時候,選擇前兩種方法較好。

檢索線程的退出代碼

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

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

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

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

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

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

總結

以上是生活随笔為你收集整理的MFC启动和关闭线程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。