在 MFC 中,可以使用 CWinThread 类来创建和管理线程。要判断其他所有线程是否还在运行,并安全终止它们,可以通过以下步骤实现:

  1. 在主线程中,获取所有的线程句柄,并保存到一个数组中。
CArray<HANDLE, HANDLE> threadHandles; // 保存线程句柄的数组

POSITION pos = AfxGetThreadState()->m_threadList.GetHeadPosition();
while (pos != NULL) {
    CWinThread* pThread = AfxGetThreadState()->m_threadList.GetNext(pos);
    threadHandles.Add(pThread->m_hThread);
}
  1. 遍历线程句柄数组,判断每个线程是否还在运行。
BOOL IsThreadRunning(HANDLE hThread) {
    DWORD dwExitCode;
    if (GetExitCodeThread(hThread, &dwExitCode) && dwExitCode == STILL_ACTIVE) {
        return TRUE;
    }
    return FALSE;
}

BOOL AreOtherThreadsRunning() {
    for (int i = 0; i < threadHandles.GetSize(); i++) {
        if (IsThreadRunning(threadHandles[i])) {
            return TRUE;
        }
    }
    return FALSE;
}
  1. 如果发现其他线程还在运行,可以向这些线程发送终止信号,并等待它们终止。
void TerminateOtherThreads() {
    for (int i = 0; i < threadHandles.GetSize(); i++) {
        if (IsThreadRunning(threadHandles[i])) {
            ::TerminateThread(threadHandles[i], 0);
            ::WaitForSingleObject(threadHandles[i], INFINITE);
        }
    }
}

这样可以确保所有的线程都被安全终止,防止内存泄漏。但是需要注意,强制终止线程可能会导致资源泄漏或者其他问题,建议在线程中定期检查某个标志位来决定是否退出线程,以实现更加安全和优雅的线程终止方式

mfc判断其他所有线程是否还有在运行并安全终止防止内存泄漏

原文地址: https://www.cveoy.top/t/topic/iU6V 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录