1.直接贴代码
// CMultiThreadDlg 对话框
class CMultiThreadDlg : public CDialogEx
{
...
public:
volatile BOOL ThreadFlag;
afx_msg void OnBnClickedButtonOpen();
}
BOOL CMultiThreadDlg::OnInitDialog()
{
...
// TODO: 在此添加额外的初始化代码
ThreadFlag = FALSE;
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
UINT ChildThread(LPVOID Param) //一个线程入口函数,CPU同时执行MFC的主线程和ChildThread线程函数
{
CMultiThreadDlg* pDlg = (CMultiThreadDlg*) Param;//创建一个指向主对话框的句柄
CString str;
int ThreadCount = 1;
while (pDlg->ThreadFlag)
{
str.Format(_T("子线程开启第%d次"), ThreadCount++);
pDlg->GetDlgItem(IDC_EDIT_CHILD)->SetWindowText(str);
Sleep(1000);//定时1秒钟
}
return 0; //AfxBeginThread线程的关闭,利用函数执行完毕后,自动返回,然后创建的线程也跟着关闭,对应资源也跟着释放。
}
void CMultiThreadDlg::OnBnClickedButtonOpen()
{
// TODO: 在此添加控件通知处理程序代码
if (ThreadFlag == TRUE)
{
//关闭线程函数
ThreadFlag = FALSE;
SetDlgItemText(IDC_BUTTON_Open, _T("打开线程"));
return;
}
else
{
//创建线程函数
ThreadFlag = TRUE;
HANDLE hMultiThread = AfxBeginThread(ChildThread, /*(LPVOID)*/this, THREAD_PRIORITY_IDLE);
SetDlgItemText(IDC_EDIT_MAIN, _T("主线程开启"));
SetDlgItemText(IDC_BUTTON_Open, _T("关闭线程"));
return;
}
}
- 实际效果
参考内容:
https://blog.csdn.net/naibozhuan3744/article/details/78754614