原来的实现:http://blog.csdn.net/jankercsdn/article/details/8874469 有许多不完善的地方,使用中进行了一些改动和完善,

unit uHardWorkThread;interfaceusesWindows, Messages, Classes, SysUtils, SyncObjs;constWM_QUIT_HARD_THREAD = WM_USER + 305;  //退出线程typeTHardWorkThread = class(TThread)privateFMsgHandle:THandle;                               //消息目的窗口句柄FErrorCount:Integer;                              //连续错误次数FIsWorking:boolean;                               //是否正在工作FIsSuspending:Boolean;                            //是否正在挂起FQuitEvent:TEvent;                                //退出线程事件FRunEvent:TEvent;                                 //运行事件,有信号表示运行FWorkCompletedEvent:TEvent;                       //工作完成事件, 有信号表示完成FPIsInterrupt:PBoolean;                           //中断protectedfunction  WaitForWorkCompleted(const AWaitTime:Integer):Boolean;        //等待线程工作完成procedure SetupWorkCompleted(AWorkCompleted:Boolean);                   //设置线程工作状态procedure ImmediatelySuspend;                                           //立即挂起,一般继承子孙类内部用procedure Execute; override;procedure DoWorkProc(const APIsInterrupt:PBoolean); virtual; abstract;  //实际的工作过程(虚方法,子类必须实现)publicconstructor Create(AMsgHandle:THandle); virtual;                        //这个句柄注意,当消息目的窗体的Position变化时,窗体的Handle就变了(比如Dock窗体)destructor Destroy; override;procedure StartThread;                                                  //开始线程function  ExitThread(const AWaitTime:Integer):Boolean;                  //退出线程function  SuspendThread(const AWaitTime:Integer):Boolean;               //挂起线程procedure ResumeThread;                                                 //恢复线程property  MsgHandle:THandle read FMsgHandle write FMsgHandle;           //消息句柄property  ErrorCount:Integer read FErrorCount;end;implementation{ THardWorkThread }constructor THardWorkThread.Create(AMsgHandle: THandle);
begininherited Create(True);FMsgHandle:=AMsgHandle;FQuitEvent:=TEvent.Create;FRunEvent:=TEvent.Create;FRunEvent.ResetEvent;FWorkCompletedEvent:=TEvent.Create;FWorkCompletedEvent.SetEvent;New(FPIsInterrupt);FPIsInterrupt^:=False;FErrorCount:=0;FIsWorking:=False;FIsSuspending:=True;//FreeOnTerminate:=True;  //不要自动释放
end;destructor THardWorkThread.Destroy;
beginDispose(FPIsInterrupt);FWorkCompletedEvent.Free;FRunEvent.Free;FQuitEvent.Free;inherited;
end;{
procedure THardWorkThread.DoWorkProc;
beginend;
}
procedure THardWorkThread.Execute;
varMsg:TMsg;
beginwhile True dobeginif PeekMessage(Msg,0,0,0,PM_REMOVE) thenbeginif Msg.message = WM_QUIT_HARD_THREAD thenbeginFQuitEvent.SetEvent;Break;end;end;if FPIsInterrupt^ thenbeginContinue;end;//等待运行FIsSuspending := True;FRunEvent.WaitFor(INFINITE);FIsSuspending := False;//退出时,如果线程挂起,则要恢复线程,然后退出if PeekMessage(Msg,0,0,0,PM_NOREMOVE) thenbeginif Msg.message = WM_QUIT_HARD_THREAD thenContinue;end;if FPIsInterrupt^ thenbeginContinue;end;SetupWorkCompleted(False);          //开始工作tryDoWorkProc(FPIsInterrupt);finallySetupWorkCompleted(True);        //完成工作end;Sleep(100);end;
end;function THardWorkThread.ExitThread(const AWaitTime: Integer): Boolean;
beginResult:=True;FPIsInterrupt^:=True;PostThreadMessage(ThreadID,WM_QUIT_HARD_THREAD,0,0);if FIsSuspending thenResumeThread;//PostThreadMessage(ThreadID,WM_QUIT_HARD_THREAD,0,0);if FQuitEvent.WaitFor(AWaitTime) = wrTimeOut thenResult:=False;
end;procedure THardWorkThread.ImmediatelySuspend;
beginFRunEvent.ResetEvent;//FIsSuspending := True;
end;procedure THardWorkThread.ResumeThread;
beginFRunEvent.SetEvent;//FIsSuspending := False;
end;procedure THardWorkThread.SetupWorkCompleted(AWorkCompleted: Boolean);
beginFIsWorking:=not AWorkCompleted;if AWorkCompleted thenbeginFWorkCompletedEvent.SetEvent;endelsebeginFWorkCompletedEvent.ResetEvent;end;
end;procedure THardWorkThread.StartThread;
beginStart;
end;function THardWorkThread.SuspendThread(const AWaitTime: Integer): Boolean;
beginResult:=False;if FIsSuspending thenbeginResult:=True;endelsebeginif WaitForWorkCompleted(AWaitTime) thenbeginFRunEvent.ResetEvent;FIsSuspending:=True;Result:=True;end;end;
end;function THardWorkThread.WaitForWorkCompleted(const AWaitTime: Integer): Boolean;
beginResult:=True;if FIsWorking thenResult:=FWorkCompletedEvent.WaitFor(AWaitTime) = wrSignaled;
end;end.

转载于:https://www.cnblogs.com/jankerxp/p/7774030.html

关于线程的停止、挂起、退出(修改)相关推荐

  1. MFC之AfxbeginThread 线程 创建、挂起、释放、结束、退出

    MFC之AfxbeginThread 线程 创建.挂起.释放.结束.退出 本文简单阐述了如何使用一个afxbeginthread创建一个线程(两种方法,使用默认设置,使用自主设置参数),以及一些如同, ...

  2. (58)模拟线程切换——添加挂起、恢复线程功能

    一.回顾 我们在上一篇博客分析了模拟线程切换的源码. <模拟线程切换> 我们着重分析了 Scheduling 和 SwitchContext 这两个函数,对线程切换的过程有了新的认识: 线 ...

  3. 线程阻塞和挂起(网络收集)

    线程阻塞 线程在运行的过程中因为某些原因而发生阻塞,阻塞状态的线程的特点是:该线程放弃CPU的使用,暂停运行,只有等到导致阻塞的原因消除之后才回复运行.或者是被其他的线程中断,该线程也会退出阻塞状态, ...

  4. java 线程强制停止线程_java多线程之停止线程

    在多线程开发中停止线程是非常重要的技术点. 停止线程在Java语言中并不像break语句那样干脆.须要一些技巧性的处理. 一.  异常法 採用异常法来停止一个线程.首先我们须要了解一下两个方法的使用方 ...

  5. 运行中的线程如何停止?

    停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作.停止一个线程可以用Thread.stop()方法,但最好不要用它.虽然它确实可以停止一个正在运行的线程,但是这个方法是不安 ...

  6. java多线程-线程的停止【interrupt】

    java多线程-线程的停止 文章目录 java多线程-线程的停止 线程停止的原理 如何正确停止线程 在普通情况下停止线程 代码展示 在阻塞情况下停止线程 代码展示 线程在每次迭代后都阻塞 代码展示 停 ...

  7. C# 关闭主窗口后让所有线程都停止工作

    参考资料:http://hi.baidu.com/liusc/blog/item/df822f290206cef498250afe.html 设置线程的IsBackground属性为True 关于Th ...

  8. tomcat 停止 java 线程不停止_Java Tomcat,底层Netty线程不停止

    我正在尝试使用log4j appender将日志发送到GrayLog2(log4j2-gelf).所以我加我的依赖到我的pom.xml配置log4j2.xml来配置我的appender.用maven构 ...

  9. println 停止线程_停止调试使用Println并改用Delve

    println 停止线程 您上一次尝试学习一种新的编程语言是什么时候? 您是否坚持尝试和真实,还是在新产品发布后立即尝试的勇敢灵魂之一? 无论哪种方式,学习一种新语言都是非常有用的,而且很有趣. 您可 ...

最新文章

  1. python 参数
  2. 搭建hadoop2.6.0 HA及YARN HA
  3. java和equals区别_JAVA中==与equals的区别
  4. Windows 常用快捷键 + word常用快捷键 +常用工具调用
  5. git log格式化日志
  6. android ui设计当前不同版本的变化,Android 4.0设计规范 十大界面改变
  7. vm14 Ubuntu16不能复制粘贴
  8. 微信小程序开发者工具详解
  9. 数据分析常用的100个指标和术语
  10. matlab频谱分析中振幅的物理意义,对速度信号进行傅里叶谱分析之后,其纵坐标对应的幅值的物理意义是什么?是速度,还是振幅...
  11. php自助旅游网站平台
  12. SRS 代码分析【HLS切片】
  13. js整数向上取整(自定义取整几位)
  14. 中国34个省市 按字母排序 uniapp城市列表
  15. unity lua热重载,编辑器下检查lua文件的变化,前端自动热更lua代码
  16. ACM MM 2021|基于深度学习的图像水印去除
  17. 基于SSM实现的图书借阅管理系统
  18. Infineon HSW High-Side Switches
  19. 谁是U盘的真正发明者?
  20. 光纤入户网络需求分析及解决方案

热门文章

  1. 蔚来2018年平均每天亏掉2641万,车辆交付预期环比腰斩
  2. MIT深度学习课堂开课啦,自动驾驶圈大牛排队来讲课丨资源
  3. 这算抄百度?Google为信息流告别简洁搜索框,也押注短视频
  4. 硬骨难啃:大众想收购自动驾驶公司Aurora,但被拒绝了
  5. 喜欢赌球的你,可能被AI盯上了
  6. 很遗憾AI还不能审查出儿童性侵录像:沙漠也被当成小黄片
  7. 纽约大学的好奇AI特别会提问,桌游玩得比人还666
  8. 国务院:光伏发电指标开始向东北倾斜
  9. 读取FTP上的excel文件,并写入数据库
  10. 人工智能丰收时代,传统营销企业如何应对?