delphi 线程的使用
- unit untWorkThread;
- interface
- uses
- Windows,Classes,SysUtils;
- type
- TWorkItem=class
- end;
- TProcessWork=procedure (Sender:TObject;Work:TWorkItem) of Object;
- TWorkThread=class(TThread)
- private
- FCriticalSection:TRTLCriticalSection;
- hEvent:Cardinal;
- FList:TList;
- FProcessWork:TProcessWork;
- procedure ProcessWork(Work:TWorkItem);
- function GetWork(var AWork:TWorkItem):Boolean;
- protected
- procedure Execute;override;
- public
- procedure AddWork(AWork:TWorkItem);
- constructor Create;
- destructor Destroy; override;
- property OnProcessWork:TProcessWork read FProcessWork write FProcessWork;
- end;
- implementation
- {TWorkThread}
- constructor TWorkThread.Create;
- begin
- InitializeCriticalSection(FCriticalSection);
- hEvent:=CreateEvent(nil,False,False,nil);
- FList:=TList.Create;
- Self.FreeOnTerminate:=False;
- inherited Create(False);
- end;
- destructor TWorkThread.Destroy;
- var
- i:Integer;
- begin
- for i:=FList.Count- downto do TWorkItem(FList.Items[i]).Free;
- DeleteCriticalSection(FCriticalSection);
- FList.Free;
- CloseHandle(hEvent);
- end;
- function TWorkThread.GetWork(var AWork:TWorkItem):Boolean;
- begin
- Result:=False;
- EnterCriticalSection(FCriticalSection);
- try
- if FList.Count> then
- begin
- AWork:=TWorkItem(FList.Items[]);
- FList.Delete();
- Result:=True;
- end;
- finally
- LeaveCriticalSection(FCriticalSection);
- end;
- end;
- procedure TWorkThread.Execute;
- var
- Work:TWorkItem;
- begin
- while not Self.Terminated do
- begin
- WaitForSingleObject(hEvent,INFINITE);
- while GetWork(Work) do
- begin
- ProcessWork(Work);
- Work.Free;
- end;
- end;
- end;
- procedure TWorkThread.ProcessWork(Work:TWorkItem);
- begin
- if Assigned(FProcessWork) then FProcessWork(Self,Work);
- end;
- procedure TWorkThread.AddWork(AWork:TWorkItem);
- begin
- EnterCriticalSection(FCriticalSection);
- try
- FList.Add(AWork);
- finally
- LeaveCriticalSection(FCriticalSection);
- end;
- SetEvent(hEvent);
- end;
- end.
delphi 线程的使用的更多相关文章
- TMsgThread, TCommThread -- 在delphi线程中实现消息循环
http://delphi.cjcsoft.net//viewthread.php?tid=635 在delphi线程中实现消息循环 在delphi线程中实现消息循环 Delphi的TThread类使 ...
- TMsgThread, TCommThread -- 在delphi线程中实现消息循环(105篇博客,好多研究消息的文章)
在delphi线程中实现消息循环 在delphi线程中实现消息循环 Delphi的TThread类使用很方便,但是有时候我们需要在线程类中使用消息循环,delphi没有提供. 花了两天的事件研究了 ...
- delphi 线程教学第六节:TList与泛型
第六节: TList 与泛型 TList 是一个重要的容器,用途广泛,配合泛型,更是如虎添翼. 我们先来改进一下带泛型的 TList 基类,以便以后使用. 本例源码下载(delphi XE8版本) ...
- Delphi线程定时器TThreadedTimer及用法--还有TThreadList用法可以locklist
Delphi线程定时器 - -人生如歌- - 博客园http://www.cnblogs.com/zhengwei0113/p/4192010.html (* 自己编写的线程计时器,没有采用消息机制, ...
- delphi 线程教学第二节:在线程时空中操作界面(UI)
第二节:在线程时空中操作界面(UI) 1.为什么要用 TThread ? TThread 基于操作系统的线程函数封装,隐藏了诸多繁琐的细节. 适合于大部分情况多线程任务的实现.这个理由足够了吧 ...
- delphi 线程教学第一节:初识多线程
第一节:初识多线程 1.为什么要学习多线程编程? 多线程(多个线程同时运行)编程,亦可称之为异步编程. 有了多线程,主界面才不会因为耗时代码而造成“假死“状态. 有了多线程,才能使多个任务同时 ...
- 多线程的基本概念和Delphi线程对象Tthread介绍
多线程的基本概念和Delphi线程对象Tthread介绍 作者:xiaoru WIN 98/NT/2000/XP是个多任务操作系统,也就是:一个进程可以划分为多个线程,每个线程轮流占用CPU运行 ...
- Delphi线程的终止
当线程对象的Execute()执行完毕,我们就认为此线程终止了.这时候,它会调用Delphi的一个标准例程EndThread(),这个例程再调用API函数ExitThread().由ExitThrea ...
- Delphi线程基础知识
参考http://blog.chinaunix.net/uid-10535208-id-2949323.html 一.概述 Delphi提供了好几种对象以方便进行多线程编程.多线程应用程序有以下几方面 ...
- Delphi 线程同步技术(转)
上次跟大家分享了线程的标准代码,其实在线程的使用中最重要的是线程的同步问题,如果你在使用线程后,发现你的界面经常被卡死,或者无法显示出来,显示混乱,你的使用的变量值老是不按预想的变化,结果往往出乎意料 ...
随机推荐
- java object 转为 json
JSONObject jsonObject=JSONObject.fromObject(map) 执行到这的时候没有任何反应的原因及解决办法 http://blog.csdn.net/tjcyjd/a ...
- 端口被sysmtem占用
今天启动Apache的时候老是提示失败,很简单,使用 netstat -ano 发现80端口被占用.如图所示:
- Spring -- aop, 用Aspectj进行AOP开发
1. 概要 添加类库:aspectjrt.jar和aspectjweaver.jar 添加aop schema. 定义xml元素:<aop:aspectj-autoproxy> 编写jav ...
- B/S,C/S简单介绍
B/S,C/S 架构 硬件环境不同:C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务. B/S 建立在广域网之上的, 不必是专门的网络硬件环境, ...
- 【sparkStreaming】kafka作为数据源的生产和消费
1.建立生产者发送数据 (1)配置zookeeper属性信息props (2)通过 new KafkaProducer[KeyType,ValueType](props) 建立producer (3) ...
- Caffe初试
1.基本概念 Caffe是一个比较流行的神经网络框架,它支持C++.Python等语言,容易上手,但是代码貌似不怎么好读,等有空我...;) 2.Windows10下的部署 我把我Windows下的编 ...
- 常见CSS浏览器兼容性问题与解决方案【转载自http://blog.csdn.net/chuyuqing/article/details/37561313/】
所谓的浏览器兼容性问题,是指因为不同的浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情况.在大多数情况下,我们的需求是,无论用户用什么浏览器来查看我们的网站或者登陆我们的系统,都应该是统一的 ...
- 蓝牙(cc2540) 协议栈 学习一
---------------------------------------------------------- app ------------------------------------- ...
- jqueryDom操作
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...
- LeetCode OJ:Integer to Roman(转换整数到罗马字符)
Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 t ...