首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 程式關閉後進程殘留?C++ DLL 線程未正確清理

     編輯:程式設計綜合問答

現象

C# 主程式呼叫 C++ DLL,DLL 在 DLL_PROCESS_ATTACH 建立多個執行緒,DLL_PROCESS_DETACH 中嘗試關閉執行緒句柄並釋放資源,但關閉 C# 程式時 MessageBox 未彈出,進程仍殘留在工作管理員中。

原因分析

  • DLL_PROCESS_DETACH 在進程正常退出時會被呼叫,但若進程被強制終止(如 Process.Kill()、使用者從工作管理員結束進程),DLL 卸載程式碼不會執行。
  • 若 C# 端直接呼叫 Environment.Exit() 或主視窗關閉未正確等待背景執行緒,可能導致 DLL 卸載邏輯未跑完。

解決方案

  1. C# 端優雅關閉:在 FormClosing 事件中通知 DLL 執行清理函數(需額外匯出 Cleanup()),再 Application.Exit()。
  2. 最後手段:強制殺進程(不推薦常用):
    System.Diagnostics.Process.GetCurrentProcess().Kill();
  3. DLL 端改進:使用事件/信號量通知工作執行緒退出,而非直接 CloseHandle(僅關閉句柄,不終止執行緒)。正確做法是設定退出旗標,WaitForSingleObject 等待執行緒結束。

關鍵代碼修正 (DLL)

// 全域退出旗標
volatile BOOL g_bExit = FALSE;

DWORD WINAPI WorkerThread(LPVOID) {
    while (!g_bExit) { /* 工作 */ }
    return 0;
}

case DLL_PROCESS_DETACH:
    g_bExit = TRUE;
    // 等待執行緒結束(需儲存執行緒 ID 或句柄陣列)
    WaitForMultipleObjects(threadCount, hThreads, TRUE, 5000);
    // 釋放資源...
    break;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved