我在MFC的对话框初始化函数中启动了一个线程,线程内部代码如下(dlg为线程参数,即当前对话框,g_hMutex为互斥变量,m_thrun为窗体终止标志):for (int i = 0; i < num; i++)
{
WaitForSingleObject(g_hMutex, INFINITE);
if (!dlg->m_thrun)
{
ReleaseMutex(g_hMutex);
return 0;
}
CString str;
str.Format(_T("%d"), i + 1);
m_list->SetItemState(i, LVIS_SELECTED, LVIS_SELECTED);
m_list->EnsureVisible(i, TRUE);
m_list->SetItemText(i, 2, _T("正在处理..."));
Sleep(200); // 关键点
m_list->SetItemText(i, 2, _T("已处理"));
m_list->SetItemText(i, 3, _T("临时文件已删除"));
dlg->GetDlgItem(IDC_EDT_NUM)->SetWindowText(str);
dlg->m_step.SetPos(i + 1);
Sleep(200);
ReleaseMutex(g_hMutex);
}
然后我在oncancel()函数中加入了如下代码:
WaitForSingleObject(g_hMutex, INFINITE);
m_thrun = FALSE;
ReleaseMutex(g_hMutex);
CloseHandle(g_hMutex);
CDialog::OnCancel();
为什么每次在线程执行过程中我点退出程序会卡住不再运行了?那个关键点sleep时间短了就没问题,长了就点一次死一次,求高手赐教
{
WaitForSingleObject(g_hMutex, INFINITE);
if (!dlg->m_thrun)
{
ReleaseMutex(g_hMutex);
return 0;
}
CString str;
str.Format(_T("%d"), i + 1);
m_list->SetItemState(i, LVIS_SELECTED, LVIS_SELECTED);
m_list->EnsureVisible(i, TRUE);
m_list->SetItemText(i, 2, _T("正在处理..."));
Sleep(200); // 关键点
m_list->SetItemText(i, 2, _T("已处理"));
m_list->SetItemText(i, 3, _T("临时文件已删除"));
dlg->GetDlgItem(IDC_EDT_NUM)->SetWindowText(str);
dlg->m_step.SetPos(i + 1);
Sleep(200);
ReleaseMutex(g_hMutex);
}
然后我在oncancel()函数中加入了如下代码:
WaitForSingleObject(g_hMutex, INFINITE);
m_thrun = FALSE;
ReleaseMutex(g_hMutex);
CloseHandle(g_hMutex);
CDialog::OnCancel();
为什么每次在线程执行过程中我点退出程序会卡住不再运行了?那个关键点sleep时间短了就没问题,长了就点一次死一次,求高手赐教
m_thrun = FALSE;
放到waitforsingleobject前面,要不然就死锁了时间短可以是因为线程已经执行完成了,不会死锁了