• 在使用线程时,最麻烦的就是线程的同步控制,如暂停、继续、停止(包括暂停状态下)等。虽然微软提供了 SuspendThread、TerminateThread 等函数“似乎”可以完成这个功能,但如果你在代码里使用这些函数,则往往会...

    在使用线程时,最麻烦的就是线程的同步控制,如暂停、继续、停止(包括暂停状态下)等。虽然微软提供了 SuspendThread、TerminateThread 等函数“似乎”可以完成这个功能,但如果你在代码里使用这些函数,则往往会遇到各种问题(比如SuspendThread时正好在CRT分配内存的锁中造成其他线程也跟着锁死,TerminateThread时资源未释放)等。

    本人经过试验和总结,整理出可以安全的进行暂停、继续、停止线程执行的一个线程类,能非常方便的对线程进行控制。

    使用起来非常方便,只需从 FTL::CFThread 继承出一个子类,实现 Run 方法即可。要“安全高效”的提供控制功能,也非常简单,只需实现如下所示的代码框架即可:

    DWORD CMyThreadDemo::Run()
    {
    	//线程初始化
    	//进行线程的实际处理循环(比如压缩文件),每隔一小段时间调用一次 GetThreadWaitType
    	//  此处以 SleepAndCheckStop 函数来模拟线程处理逻辑,也演示了替代系统提供的 Sleep 函数的方式
    	while (FTL::ftwtTimeOut == SleepAndCheckStop(100))
    	{
    		::PostMessage(m_hWndParent, WM_THREAD_UPDATE_PROGRESS, 0, 0);
    		//每隔循环周期内调用 GetThreadWaitType 来判断用户是否暂停或停止了
    		//  (如果用户暂停了线程执行,将会阻塞在这个函数内部,直到用户继续或停止线程)
    		if (FTL::ftwtContinue != GetThreadWaitType(INFINITE))
    		{
    			//如果到了这个地方,在使用 INFINITE 参数时只有一种情况:即调用了 Stop 函数停止了线程
    			//因此可以进行线程退出前的处理(比如释放资源等)
    			//PS: 从设计上来说,还有可能返回 ftwtError, 但从来没有出现过
    			break;
    		}
    	}
    	return 0;
    }

    详细的封装类和Sample程序参见下载地址:http://download.csdn.net/detail/fishjam/4199009
    展开全文
  • 2、那么如何实现主线程等待子线程的执行之后再结束,这个就要用到CountDownLatch,设置要执行的线程的个数,然后再子线程的run方法中调用countDown()的方法,递减线程的计数。在主线程结束之前,调用aw
  • 讲述了如何使用C++ 11的条件变量实现主线程控制子线程任务的开始和停止,减少了启动线程的开销
  • Qt中主线程子线程之间操作的问题 今天在工作的时候遇到一个Qt中关于多线程的问题,困扰了半天时间,在同事的帮助下解决了,因此来记录一下,以免下次在遇到时又一脸懵,也供像我一样的小白借鉴。好与不好请勿乱评...
  • C++线程暂停 2013-12-19 11:11:44
    线程中,线程需要暂停的原因多种多样,基本分为两大类,1是等待数据,2是系统资源紧张,停止计算以把资源让给其他线程.一般初学者会使用的方法就是使用SuspendThread和ResumeThread这两个API或者他们的包装函数...
  • [c/c++] 一个进程有多个线程,用什么方法让主线程不退出更好,要求占用资源最少,效率最高? 我所知道的不让主线程退出的方法有: 一,死循环:while(1);/ for(;;); 二,pause(); 让主线程暂停等待信号使其退出 ...
  • 如何暂停主线程直到第二个线程的终止?来自 http://www.codeproject.com/threads/waitthreadmsi.asp#xx441032xxBy Ybbozman 不要被线程这个词给吓坏了,留下来先看看吧;)作为翻译这篇短文的我在VC++开发中遇到了与 ...
  • 线程暂停和继续实现 2017-02-24 09:39:04
    开启一个子线程来显示发动机上的运行时间,如果发动机暂停运行,那么这个线程也会暂停,发动机又开动的时候,线程继续开启,数据也是连贯着的; Timer timer=new Timer();TimerTask task=new TimerTask() { @...
  • [c/c++] 一个进程有多个线程,用什么方法让主线程不退出更好,要求占用资源最少,效率最高 我所知道的不让主线程退出的方法有: 一,死循环:while(1);/ for(;;); 二,pause(); 让主线程暂停等待信号使其退出 三,...
  • //先运行TraditionalThreadCommunition的主线程的内容,bShouldSub为false,故线程暂停,进入线程,运行完后启动正在等待的主线程,运行完后进入50次的循环 public class TraditionalThreadCommunition { public...
  • 控制线程,开启、暂停、继续、终止(实例) 我们这些文盲以前一听到多线程这么几个字,以为非常的高级,难搞!!昨天翻阅了一下MSDN,发现,其实也没那么难,关键在于全面的理解,也许是用多...
  • 由于项目的需要,最近几天一直在做串口和数据库。由于C#使用的时间不长,所以在编写代码和调试的过程中总是遇到意想不到的问题,比如在使用串口接收数据的时候,在接收数据事件中想把接收的数据放入一个textbox作...
  • 所谓挂起,是指暂停线程的执行,用户可以通过气候的唤醒操作来恢复线程的执行.线程终止是指结束线程的运行.系统提供了SuspendThread,ResumeThread和TerminateThread等函数来实现线程的挂起、唤醒和停止操作。...
  • C#线程(一)线程基础 2019-01-16 09:37:53
    一、创建线程 用 Thread t = new Thread(TestFun);创建子线程,并修改这个线程的名称 主线程同时执行TestFun函数...来暂停线程,这里我们让主线程暂停了一秒钟,你会看到主线程的输出结果比子线程晚了一秒 ...
  • 控制线程,开启、暂停、继续、终止(实例)  我们这些文盲以前一听到多线程这么几个字,以为非常的高级,难搞!!昨天翻阅了一下MSDN,发现,其实也没那么难,关键在于全面的理解,也许是用多了API了,慢慢的...
  • Linux监听子线程的函数 2011-07-27 00:16:36
    所有下面哪些调用都被用于等待进程状态的改 变,获取状态已改变的进程信息。状态改变可被认为是:1.进程已终止。2.信号导致进程停止执行。3.信号恢复进程的执行。在进程终止的情况 下,wait调用将允许
  • MFC 线程暂停与继续,请问如何做啊。新手。新建线程hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Test,NULL,0,&ThreadID);用WaitForSingleObject( hThread, INFINITE );使它暂停了。请问如何让它重新开始...
  • 详解c++线程(一) 2019-06-28 21:20:49
    c++的多线程可以充分利用计算机资源,提高代码运行效率。在这里总结了一些多线程应用过程中的基本概念和用法。 一、进程与线程 进程是资源分配和调度的一个独立单位。而线程是进程的一个实体,是CPU调度和分派的...
  • 前言 老听公司的老哥们说MFC基于消息机制什么的...我理解的信号就是当线程主线程执行完某一步,需要把当前执行的结果反馈给主线程线程,这时候通过一个消息符号(自定义),该消息符号约定了具体做什么(接收到该信...
  • 主线程开启子线程初始化,读写串口数据,有数据就读,提取有效数据,并用信号将数据传送给主线程,创建界面对象,主线程通过开关按钮槽函数控制串口的打开关闭,图形的显示以及暂停,实时刷新波形。串口读取数据...
1 2 3 4 5 ... 20
收藏数 6,526
精华内容 2,610