windows结束线程的三种方式
生活随笔
收集整理的這篇文章主要介紹了
windows结束线程的三种方式
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
windows 結(jié)束線程有三種方式
一、讓線程函數(shù)執(zhí)行到 return
二、在線程函數(shù)內(nèi)調(diào)用 ExitThread
三、調(diào)用 TerminateThread
其中前兩種方式比較類似,它們都是通過修改某個(gè)變量來達(dá)到改變子線程執(zhí)行流程,從而實(shí)現(xiàn)退出的目的。這兩種方式是同步的,安全的,線程退出后會(huì)系統(tǒng)會(huì)清理堆棧。
第三種方式 TerminateThread 是異步的,它會(huì)創(chuàng)建一個(gè)新的線程去結(jié)束我們希望干掉的線程,該函數(shù)立即返回,是異步的。如果程序希望線程真的結(jié)束,然后再往下走,那么就需要在 TerminateThread 后面調(diào)用 WaitForSingleObject 函數(shù),阻塞等待線程真的結(jié)束。
如果希望子線程安全地退出,并執(zhí)行釋放資源代碼,使用方式一;
如果希望子線程直接退出,沒有需要釋放的資源,可以使用方式二;
第三種方式結(jié)束線程不安全,系統(tǒng)不會(huì)清理子線程的堆棧,不推薦使用。
這是我寫的一個(gè)測試程序:
下面附上三種結(jié)束方式的實(shí)現(xiàn)
方式一(推薦)
// ThreadOperatorGUI.cpp : Defines the entry point for the application. //#include "stdafx.h"BOOL flag = TRUE; // 控制子線程結(jié)束DWORD WINAPI MyThread(LPVOID lpParam) {HWND hEdit = (HWND)lpParam;TCHAR szBuffer[10];GetWindowText(hEdit, szBuffer, 10); for (int i = 0; i <= 10000; i++){if (!flag) break;_stprintf(szBuffer, TEXT("%d"), i);SetWindowText(hEdit, szBuffer); Sleep(200);}return 0; }BOOL CALLBACK MainDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {static HWND hEdit;static HANDLE hThread;switch(uMsg){case WM_CLOSE:{EndDialog(hDlg, 0);return TRUE;}case WM_INITDIALOG:{hEdit = GetDlgItem(hDlg, IDC_EDIT);SetWindowText(hEdit, "0");return TRUE;}case WM_COMMAND:{switch(LOWORD(wParam)){case IDC_BUTTON1:{hThread = CreateThread(0, 0, MyThread, hEdit, 0, 0);return TRUE;}case IDC_BUTTON2:{SuspendThread(hThread);return TRUE;}case IDC_BUTTON3:{ResumeThread(hThread);return TRUE;}case IDC_BUTTON4:{flag = FALSE;return TRUE;}}}}return FALSE; }int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) {DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), 0, MainDialogProc);return 0; }方式二
// ThreadOperatorGUI.cpp : Defines the entry point for the application. //#include "stdafx.h"BOOL flag = TRUE; // 控制子線程結(jié)束DWORD WINAPI MyThread(LPVOID lpParam) {HWND hEdit = (HWND)lpParam;TCHAR szBuffer[10];GetWindowText(hEdit, szBuffer, 10); for (int i = 0; i <= 10000; i++){if (!flag) ExitThread(1);_stprintf(szBuffer, TEXT("%d"), i);SetWindowText(hEdit, szBuffer); Sleep(200);}return 0; }BOOL CALLBACK MainDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {static HWND hEdit;static HANDLE hThread;switch(uMsg){case WM_CLOSE:{EndDialog(hDlg, 0);return TRUE;}case WM_INITDIALOG:{hEdit = GetDlgItem(hDlg, IDC_EDIT);SetWindowText(hEdit, "0");return TRUE;}case WM_COMMAND:{switch(LOWORD(wParam)){case IDC_BUTTON1:{hThread = CreateThread(0, 0, MyThread, hEdit, 0, 0);return TRUE;}case IDC_BUTTON2:{SuspendThread(hThread);return TRUE;}case IDC_BUTTON3:{ResumeThread(hThread);return TRUE;}case IDC_BUTTON4:{flag = FALSE;return TRUE;}}}}return FALSE; }int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) {DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), 0, MainDialogProc);return 0; }方式三(不推薦)
// ThreadOperatorGUI.cpp : Defines the entry point for the application. //#include "stdafx.h"DWORD WINAPI MyThread(LPVOID lpParam) {HWND hEdit = (HWND)lpParam;TCHAR szBuffer[10];GetWindowText(hEdit, szBuffer, 10); for (int i = 0; i <= 10000; i++){_stprintf(szBuffer, TEXT("%d"), i);SetWindowText(hEdit, szBuffer); Sleep(200);}return 0; }BOOL CALLBACK MainDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {static HWND hEdit;static HANDLE hThread;switch(uMsg){case WM_CLOSE:{EndDialog(hDlg, 0);return TRUE;}case WM_INITDIALOG:{hEdit = GetDlgItem(hDlg, IDC_EDIT);SetWindowText(hEdit, "0");return TRUE;}case WM_COMMAND:{switch(LOWORD(wParam)){case IDC_BUTTON1:{hThread = CreateThread(0, 0, MyThread, hEdit, 0, 0);return TRUE;}case IDC_BUTTON2:{SuspendThread(hThread);return TRUE;}case IDC_BUTTON3:{ResumeThread(hThread);return TRUE;}case IDC_BUTTON4:{TerminateThread(hThread, 123); // 結(jié)束碼123,可自定義WaitForSingleObject(hThread, INFINITE); // 阻塞,直到hThread結(jié)束return TRUE;}}}}return FALSE; }int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) {DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), 0, MainDialogProc);return 0; } 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的windows结束线程的三种方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win32 Edit 文本框追加字符串
- 下一篇: win32 实现死锁的小例子