关于线程的停止、挂起、退出(修改)
原来的实现: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
关于线程的停止、挂起、退出(修改)相关推荐
- MFC之AfxbeginThread 线程 创建、挂起、释放、结束、退出
MFC之AfxbeginThread 线程 创建.挂起.释放.结束.退出 本文简单阐述了如何使用一个afxbeginthread创建一个线程(两种方法,使用默认设置,使用自主设置参数),以及一些如同, ...
- (58)模拟线程切换——添加挂起、恢复线程功能
一.回顾 我们在上一篇博客分析了模拟线程切换的源码. <模拟线程切换> 我们着重分析了 Scheduling 和 SwitchContext 这两个函数,对线程切换的过程有了新的认识: 线 ...
- 线程阻塞和挂起(网络收集)
线程阻塞 线程在运行的过程中因为某些原因而发生阻塞,阻塞状态的线程的特点是:该线程放弃CPU的使用,暂停运行,只有等到导致阻塞的原因消除之后才回复运行.或者是被其他的线程中断,该线程也会退出阻塞状态, ...
- java 线程强制停止线程_java多线程之停止线程
在多线程开发中停止线程是非常重要的技术点. 停止线程在Java语言中并不像break语句那样干脆.须要一些技巧性的处理. 一. 异常法 採用异常法来停止一个线程.首先我们须要了解一下两个方法的使用方 ...
- 运行中的线程如何停止?
停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作.停止一个线程可以用Thread.stop()方法,但最好不要用它.虽然它确实可以停止一个正在运行的线程,但是这个方法是不安 ...
- java多线程-线程的停止【interrupt】
java多线程-线程的停止 文章目录 java多线程-线程的停止 线程停止的原理 如何正确停止线程 在普通情况下停止线程 代码展示 在阻塞情况下停止线程 代码展示 线程在每次迭代后都阻塞 代码展示 停 ...
- C# 关闭主窗口后让所有线程都停止工作
参考资料:http://hi.baidu.com/liusc/blog/item/df822f290206cef498250afe.html 设置线程的IsBackground属性为True 关于Th ...
- tomcat 停止 java 线程不停止_Java Tomcat,底层Netty线程不停止
我正在尝试使用log4j appender将日志发送到GrayLog2(log4j2-gelf).所以我加我的依赖到我的pom.xml配置log4j2.xml来配置我的appender.用maven构 ...
- println 停止线程_停止调试使用Println并改用Delve
println 停止线程 您上一次尝试学习一种新的编程语言是什么时候? 您是否坚持尝试和真实,还是在新产品发布后立即尝试的勇敢灵魂之一? 无论哪种方式,学习一种新语言都是非常有用的,而且很有趣. 您可 ...
最新文章
- python 参数
- 搭建hadoop2.6.0 HA及YARN HA
- java和equals区别_JAVA中==与equals的区别
- Windows 常用快捷键 + word常用快捷键 +常用工具调用
- git log格式化日志
- android ui设计当前不同版本的变化,Android 4.0设计规范 十大界面改变
- vm14 Ubuntu16不能复制粘贴
- 微信小程序开发者工具详解
- 数据分析常用的100个指标和术语
- matlab频谱分析中振幅的物理意义,对速度信号进行傅里叶谱分析之后,其纵坐标对应的幅值的物理意义是什么?是速度,还是振幅...
- php自助旅游网站平台
- SRS 代码分析【HLS切片】
- js整数向上取整(自定义取整几位)
- 中国34个省市 按字母排序 uniapp城市列表
- unity lua热重载,编辑器下检查lua文件的变化,前端自动热更lua代码
- ACM MM 2021|基于深度学习的图像水印去除
- 基于SSM实现的图书借阅管理系统
- Infineon HSW High-Side Switches
- 谁是U盘的真正发明者?
- 光纤入户网络需求分析及解决方案