mfc线程挂起唤醒操作问题

问题描述

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线程的挂起、唤醒和终止

时间: 2024-09-24 00:41:42

mfc线程挂起唤醒操作问题的相关文章

线程 死锁-一个关于线程挂起、唤醒的问题

问题描述 一个关于线程挂起.唤醒的问题 在windows平台上, 线程的挂起可以使用API SuspendThread()函数,而减少线程的挂起计数则可以使用ResumeThread()函数,但是今天却发现了其中隐藏的问题:1. 现有一个主线程和子线程A,在主线程中调用SuspengThread()使得A被挂起:2. 主线程中调用ResumeThread()使得A恢复运行:3. 主线程立刻调用SuspendThread()意图挂起A时,主线程竟然被阻塞在了调用处!也就是说产生了deadlock!

Linux 线程挂起与唤醒功能 实例

pthread_cond_wait 多线程的条件变量 条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起:另一个线程使"条件成立"(给出条件成立信号).为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起. 创建和注销 条件变量和互斥锁一样,都有静态动态两种创建方式,静态方式使用PTHREAD_COND_INITIALIZER常量,如下: pthread_cond_t cond=PTHREAD_COND

多线程之Java线程阻塞与唤醒

线程的阻塞和唤醒在多线程并发过程中是一个关键点,当线程数量达到很大的数量级时,并发可能带来很多隐蔽的问题.如何正确暂停一个线程,暂停后又如何在一个要求的时间点恢复,这些都需要仔细考虑的细节.在Java发展史上曾经使用suspend().resume()方法对于线程进行阻塞唤醒,但随之出现很多问题,比较典型的还是死锁问题.如下代码,主要的逻辑代码是主线程启动线程mt一段时间后尝试使用suspend()让线程挂起,最后使用resume()恢复线程.但现实并不如愿,执行到suspend()时将一直卡住

关于weblogic中使用Dom4j、Xerces导致执行线程挂起的问题

这两天有客户跟我说了个问题,说他们发现weblogic不停的load class,最后线程都挂在了Zip Entry操作上.让他们做了thread dump, 开始以为跟JDK的IO性能有关系,因为我曾经在HP\AIX上都碰到过线程挂起在zip操作上的问题,最终客户通过调整OS参数后,问题得到解决.但在拿到thread dump后, 发现问题不是他们说的那样,thread trace如下: "ExecuteThread: '6' for queue: 'Out.Thread Pool'"

vb.net 线程挂起 怎么用?

问题描述 vb.net线程挂起怎么用?就是暂停,恢复执行的操作谁有实例啊??我用的一个说过时了,有警告信息.他吗的百度都所搜不到一个挂起的实例.服了. 解决方案 解决方案二:我也想知道解决方案三:就像sleep功能的.只是SLEEP固定时间,我的程序不是固定时间的.要某段程序执行完事,执行它~!解决方案四:suspend的完美替代品是什么??鸡巴磕了,什么破VB.net草.解决方案五:线程暂停,恢复没人知道啊?百度都不给个明确的哎解决方案六:.net不是有threading.thread.sus

MFC线程计算可以不从函数的开始的位置,而从指定的行号开始执行么

问题描述 MFC线程计算可以不从函数的开始的位置,而从指定的行号开始执行么 MFC线程计算可以不从函数的开始的位置,而从指定的行号开始执行么,怎么根据行号来执行函数? 解决方案 给需要用到的行加上标号,自己编号,在程序开头判断,用goto跳转执行

Java多线程:“基础篇”05之线程等待与唤醒

wait(), notify(), notifyAll()等方法介绍 在Object.java中,定义了wait(), notify()和notifyAll()等接口.wait()的作用是让当前线程进入 等待状态,同时,wait()也会让当前线程释放它所持有的锁.而notify()和notifyAll()的作用,则是唤 醒当前对象上的等待线程:notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程. Object类中关于等待/唤醒的API详细信息如下: notify()    

破除java神话之线程按优先级唤醒

在编写多线程代码的时候经常发生多个线程等待一个事件的情况.这种情况多发生于多个线程在同步方法或者同步块内调用wait方法等待同一个被锁住的对象.当另一个锁住该对象的线程从同步方法或者同步块中调用notify或者notifyAll方法时这些等待线程被唤醒.notify调用仅仅唤醒一个线程,因此如果有多个线程正处于等待状态,那么不会有对锁的竞争.另一方面,notifyAll调用唤醒所有的等待线程而造成竞争,然而只有一个线程能够得到锁,其它的都会被阻塞. 当多个线程处于等待状态时的问题是当调用noti

C#子线程的控件操作问题解析

有关C#子线程的控件操作 一般来说,直接在子线程中对窗体上的控件操作是会出现异常,这是由于子线 程和运行窗体的线程是不同的空间,因此想要在子线程来操作窗体上的控件,是 不可能简单的通过控件对象名来操作,但不是说不能进行操作,微软提供了 Invoke的方法,其作用就是让子线程告诉窗体线程来完成相应的控件操作. 现在用一个用线程控制的进程条来说明,大致的步骤如下: 1.创建Invoke函数,大致如下: /// < summary> /// Delegate function to be invok