MFC啟動和關閉執行緒

2021-09-24 02:37:00 字數 1942 閱讀 9731

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 物件不再存在。若要避免出現這種情況,請執行以下操作之一:

單獨儲存執行緒的控制代碼。建立執行緒後,(使用 ::duplicatehandle)將其m_hthread資料成員複製到其他變數,並通過該變數訪問該成員。這樣,終止後即會自動刪除物件,並且仍然可以找到執行緒終止的原因。請注意:在可以複製控制代碼之前,執行緒不終止。執行此操作的最安全的方式是將 create_suspended 傳遞到 ,儲存控制代碼,然後通過呼叫 繼續執行執行緒。

任一方法都可以使您確定 cwinthread 物件終止的原因。

執行緒關閉 主線程和子執行緒的關閉

今天寫執行緒,再網頁上找了些關閉執行緒的栗子,給大家整理一下 多執行緒程式的開發中,啟動了多個執行緒的程式在關閉的時候卻出現了問題,如果程式退出的時候不關閉執行緒,那麼執行緒就會一直的存在,但是大多啟動的執行緒都是區域性變數,不能一一的關閉,如果呼叫thread.currentthread.abor...

oracle啟動和關閉

資料庫的啟動有三中 1 startup nomount 這種過程又稱為 非安裝啟動 啟動過程為 啟動oracle例項,不載入資料庫,不開啟資料庫。在這個過程中只需要init.ora初始化引數檔案,重建控制檔案,即啟動sga和後台程序 在以下幾種情況下需要用到這種模式 a 資料庫的控制檔案全部損害 b...

linux啟動和關閉

startup nomount選項 讀初始化引數檔案,啟動例項 startup nomount選項啟動例項,但不安裝資料庫。當資料庫以這個模式啟動時,引數檔案被讀取 後台程序和記憶體結構被啟動 但它們不被附加或與資料庫的磁碟結構進行通訊。當例項處於這個狀態時,資料庫是不可使用的。startup mo...