mfc线程挂起唤醒操作问题

HANDLE hThread;
CWnd *pWnd;

UINT TextShow(LPVOID pParam)
{
CString szLine;
//打开文件
CStdioFile file;
file.Open(_T("E:\1.txt"), CFile::modeRead);
//逐行读取字符串
while (file.ReadString(szLine))
{
pWnd->SetWindowText(szLine);
hThread = GetCurrentThread();
SuspendThread(GetCurrentThread());
}

//关闭文件
file.Close();
return 0;

}

void CMFCApplication2Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
pWnd = GetDlgItem(TEXTT);
AfxBeginThread(TextShow,NULL);

}

void CMFCApplication2Dlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
ResumeThread(hThread);
}

我想做一个文本逐行读取的小程序,每次输出一行后暂停,用户点击按钮后继续输出下一行后暂停,这样循环下去,但是现在可以暂停点击唤醒线程的按钮去没反应不能继续执行,请问怎么解决呢

2个回答

实践中,不要用ResumeThread、SuspendThread,这样做容易导致死锁、内存泄漏等问题。你应该让你的线程去wait一个信号量来让它暂停。你从概念上都错了。

在 MSDN 的帮助中有这样一段话:This function is primarily designed for use by debuggers. It is not intended to be used for thread synchronization.
即不推荐使用 SuspendThread 做线程之间的同步,可以考虑使用信号量。

当然,你也可以使用。如果功能无效,请判断一下 SuspendThread 和 ResumeThread 的判断,再加上 GetLastError 的返回值来判断无效的原因。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问