mfc代码实现不加互斥锁判断该进程中是否有线程在运行在运行的线程安全退出
以下是使用MFC代码实现判断进程中是否有线程在运行,并安全退出的示例:
#include <afxwin.h>
#include <afxmt.h>
// 全局变量
CEvent g_exitEvent(FALSE, TRUE); // 退出事件
// 线程类
class CMyThread : public CWinThread
{
public:
virtual BOOL InitInstance()
{
// 线程初始化
return TRUE;
}
virtual int ExitInstance()
{
// 线程退出
return CWinThread::ExitInstance();
}
virtual int Run()
{
// 执行线程任务
while (1)
{
// 检查退出事件是否被触发
if (g_exitEvent.Lock(0) == WAIT_OBJECT_0)
break;
// 执行线程任务
// ...
Sleep(1000); // 假设线程任务每秒执行一次
}
return 0;
}
};
// 对话框类
class CMyDialog : public CDialogEx
{
public:
CMyDialog(CWnd* pParent = nullptr) : CDialogEx(IDD_MYDIALOG, pParent)
{
}
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_MYDIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
DECLARE_MESSAGE_MAP()
private:
CMyThread* m_pThread; // 线程指针
public:
afx_msg void OnBnClickedStartButton()
{
// 创建线程
m_pThread = (CMyThread*)AfxBeginThread(RUNTIME_CLASS(CMyThread));
}
afx_msg void OnBnClickedStopButton()
{
// 发送退出事件
g_exitEvent.SetEvent();
// 等待线程退出
if (m_pThread != nullptr)
{
WaitForSingleObject(m_pThread->m_hThread, INFINITE);
m_pThread = nullptr;
}
}
};
BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)
ON_BN_CLICKED(IDC_START_BUTTON, &CMyDialog::OnBnClickedStartButton)
ON_BN_CLICKED(IDC_STOP_BUTTON, &CMyDialog::OnBnClickedStopButton)
END_MESSAGE_MAP()
// 主函数
int main()
{
// 初始化MFC
AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0);
// 创建对话框
CMyDialog dlg;
dlg.DoModal();
return 0;
}
在上述示例中,我们创建了一个CMyThread类来表示执行线程任务的线程。在该类的Run函数中,通过循环检查退出事件g_exitEvent是否被触发来判断是否需要退出线程。当点击停止按钮时,我们会设置退出事件,然后等待线程退出。
在CMyDialog类中,我们创建了两个按钮,分别用于启动和停止线程。点击启动按钮时,我们调用AfxBeginThread函数创建CMyThread线程对象并启动线程。点击停止按钮时,我们会设置退出事件并等待线程退出。
需要注意的是,以上示例没有使用互斥锁来判断线程是否在运行,而是通过事件来控制线程的退出。这是因为使用互斥锁判断线程是否在运行可能会存在竞态条件,导致判断结果不准确。使用事件可以避免这个问题
原文地址: https://www.cveoy.top/t/topic/iWAs 著作权归作者所有。请勿转载和采集!