问题描述
- 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);
}我想做一个文本逐行读取的小程序,每次输出一行后暂停,用户点击按钮后继续输出下一行后暂停,这样循环下去,但是现在可以暂停点击唤醒线程的按钮去没反应不能继续执行,请问怎么解决呢
解决方案
实践中,不要用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 的返回值来判断无效的原因。
解决方案三:
线程的挂起和唤醒
求助,关于MFC线程数据共享的问题
MFC线程的挂起、唤醒和终止