ResumeThread喚醒與SuspendThread掛起(轉載)
阿新 • • 發佈:2022-04-15
轉載地址:ResumeThread喚醒與SuspendThread掛起(C++多執行緒篇 二)
執行緒的暫停與掛起
這篇文章就給講一下,執行緒的掛起函式SuspendThread與喚醒函式ResumeThread。
上一篇文章說到的 建立執行緒的函式,就相當於是給我們建立了一部小汽車。但是這部小汽車還沒有剎車和一鍵啟動,掛起函式SuspendThread與喚醒函式ResumeThread 就好比是汽車的剎車與一鍵啟動。
執行緒核心物件
執行緒核心物件就是一個包含了執行緒狀態資訊的資料結構,每一次對CreateThread函式的成功呼叫,系統都會在內部為新的執行緒分配一個核心物件。系統提供的管理執行緒的函式其實就是依靠訪問執行緒內部物件來實現管理的。
執行緒核心物件中記錄了執行緒核心物件的使用次數,以及指明執行緒的暫停次數,當呼叫Create Thread函式是,執行緒的核心物件就被建立了。
SuspendThread 掛起函式
SuspendThread函式掛起指定的執行緒。使用SuspendThread函式會使核心物件中的當前暫停次數 +1,函式執行完畢後返回 +1 前的次數。當執行緒的暫停計數大於0時,執行緒將處於暫停狀態。
DWORD SuspendThread(
HANDLEhThread // 需要掛起的執行緒控制代碼
);
ResumeThread 喚醒函式
ResumeThread函式減少執行緒的掛起計數。使用ResumeThread函式會使核心物件中的當前暫停次數 - 1,函式執行完畢後返回 -1 前的次數。當暫停計數減為零時,執行緒將繼續執行。
DWORD ResumeThread(
HANDLEhThread // handle to thread
);
下面用MFC寫的一個有介面的測試程式,點選 啟動執行緒 按鈕後。執行緒就會不斷迴圈累加並且列印 i 的值,點選 停止按鈕 後,執行緒就會進入掛起狀態,直到點選恢復按鈕 執行緒才會繼續執行列印操作。
程式碼如下:
UINT PrintFun(LPVOID pParam)//執行緒函式定義
{
int i = 1;
CString str;
while (TRUE)
{
str.Format(_T("%d\n"), i);
OutputDebugString (str);
Sleep(50);
i++;
}
}
HANDLE hThread = NULL; //儲存執行緒控制代碼
//啟動執行緒按鈕響應函式
void CThreadMfcDlg::OnBnClickedOk()
{
CWinThread* pThread = AfxBeginThread(PrintFun, NULL);
hThread = pThread->m_hThread;
// TODO: 在此新增控制元件通知處理程式程式碼
//CDialog::OnOK();
}
//暫停按鈕響應函式
void CThreadMfcDlg::OnBnClickedButton1()
{
int x = SuspendThread(hThread);
// TODO: 在此新增控制元件通知處理程式程式碼
}
//恢復按鈕響應函式
void CThreadMfcDlg::OnBnClickedButton2()
{
int x = ResumeThread(hThread);
// TODO: 在此新增控制元件通知處理程式程式碼
}
單個執行緒可以被暫停若干次。如果一個執行緒被暫停了3次,它必須被喚醒3次才可以分配給一個CPU。