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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

windows结束线程的三种方式

發布時間:2025/3/21 windows 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 windows结束线程的三种方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

windows 結束線程有三種方式

一、讓線程函數執行到 return

二、在線程函數內調用 ExitThread

三、調用 TerminateThread

其中前兩種方式比較類似,它們都是通過修改某個變量來達到改變子線程執行流程,從而實現退出的目的。這兩種方式是同步的,安全的,線程退出后會系統會清理堆棧。

第三種方式 TerminateThread 是異步的,它會創建一個新的線程去結束我們希望干掉的線程,該函數立即返回,是異步的。如果程序希望線程真的結束,然后再往下走,那么就需要在 TerminateThread 后面調用 WaitForSingleObject 函數,阻塞等待線程真的結束。

如果希望子線程安全地退出,并執行釋放資源代碼,使用方式一;
如果希望子線程直接退出,沒有需要釋放的資源,可以使用方式二;
第三種方式結束線程不安全,系統不會清理子線程的堆棧,不推薦使用。

這是我寫的一個測試程序:

下面附上三種結束方式的實現

方式一(推薦)

// ThreadOperatorGUI.cpp : Defines the entry point for the application. //#include "stdafx.h"BOOL flag = TRUE; // 控制子線程結束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; // 控制子線程結束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); // 結束碼123,可自定義WaitForSingleObject(hThread, INFINITE); // 阻塞,直到hThread結束return TRUE;}}}}return FALSE; }int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) {DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), 0, MainDialogProc);return 0; } 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的windows结束线程的三种方式的全部內容,希望文章能夠幫你解決所遇到的問題。

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