1. unit untWorkThread;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows,Classes,SysUtils;
  7.  
  8. type
  9. TWorkItem=class
  10. end;
  11. TProcessWork=procedure (Sender:TObject;Work:TWorkItem) of Object;
  12. TWorkThread=class(TThread)
  13. private
  14. FCriticalSection:TRTLCriticalSection;
  15. hEvent:Cardinal;
  16. FList:TList;
  17. FProcessWork:TProcessWork;
  18. procedure ProcessWork(Work:TWorkItem);
  19. function GetWork(var AWork:TWorkItem):Boolean;
  20. protected
  21. procedure Execute;override;
  22. public
  23. procedure AddWork(AWork:TWorkItem);
  24. constructor Create;
  25. destructor Destroy; override;
  26. property OnProcessWork:TProcessWork read FProcessWork write FProcessWork;
  27. end;
  28.  
  29. implementation
  30.  
  31. {TWorkThread}
  32.  
  33. constructor TWorkThread.Create;
  34. begin
  35. InitializeCriticalSection(FCriticalSection);
  36. hEvent:=CreateEvent(nil,False,False,nil);
  37. FList:=TList.Create;
  38. Self.FreeOnTerminate:=False;
  39. inherited Create(False);
  40. end;
  41.  
  42. destructor TWorkThread.Destroy;
  43. var
  44. i:Integer;
  45. begin
  46. for i:=FList.Count- downto do TWorkItem(FList.Items[i]).Free;
  47. DeleteCriticalSection(FCriticalSection);
  48. FList.Free;
  49. CloseHandle(hEvent);
  50. end;
  51.  
  52. function TWorkThread.GetWork(var AWork:TWorkItem):Boolean;
  53. begin
  54. Result:=False;
  55. EnterCriticalSection(FCriticalSection);
  56. try
  57. if FList.Count> then
  58. begin
  59. AWork:=TWorkItem(FList.Items[]);
  60. FList.Delete();
  61. Result:=True;
  62. end;
  63. finally
  64. LeaveCriticalSection(FCriticalSection);
  65. end;
  66. end;
  67.  
  68. procedure TWorkThread.Execute;
  69. var
  70. Work:TWorkItem;
  71. begin
  72. while not Self.Terminated do
  73. begin
  74. WaitForSingleObject(hEvent,INFINITE);
  75. while GetWork(Work) do
  76. begin
  77. ProcessWork(Work);
  78. Work.Free;
  79. end;
  80. end;
  81. end;
  82.  
  83. procedure TWorkThread.ProcessWork(Work:TWorkItem);
  84. begin
  85. if Assigned(FProcessWork) then FProcessWork(Self,Work);
  86. end;
  87.  
  88. procedure TWorkThread.AddWork(AWork:TWorkItem);
  89. begin
  90. EnterCriticalSection(FCriticalSection);
  91. try
  92. FList.Add(AWork);
  93. finally
  94. LeaveCriticalSection(FCriticalSection);
  95. end;
  96. SetEvent(hEvent);
  97. end;
  98.  
  99. end.

delphi 线程的使用的更多相关文章

  1. TMsgThread, TCommThread -- 在delphi线程中实现消息循环

    http://delphi.cjcsoft.net//viewthread.php?tid=635 在delphi线程中实现消息循环 在delphi线程中实现消息循环 Delphi的TThread类使 ...

  2. TMsgThread, TCommThread -- 在delphi线程中实现消息循环(105篇博客,好多研究消息的文章)

    在delphi线程中实现消息循环 在delphi线程中实现消息循环 Delphi的TThread类使用很方便,但是有时候我们需要在线程类中使用消息循环,delphi没有提供.   花了两天的事件研究了 ...

  3. delphi 线程教学第六节:TList与泛型

    第六节: TList 与泛型   TList 是一个重要的容器,用途广泛,配合泛型,更是如虎添翼. 我们先来改进一下带泛型的 TList 基类,以便以后使用. 本例源码下载(delphi XE8版本) ...

  4. Delphi线程定时器TThreadedTimer及用法--还有TThreadList用法可以locklist

    Delphi线程定时器 - -人生如歌- - 博客园http://www.cnblogs.com/zhengwei0113/p/4192010.html (* 自己编写的线程计时器,没有采用消息机制, ...

  5. delphi 线程教学第二节:在线程时空中操作界面(UI)

    第二节:在线程时空中操作界面(UI)   1.为什么要用 TThread ?   TThread 基于操作系统的线程函数封装,隐藏了诸多繁琐的细节. 适合于大部分情况多线程任务的实现.这个理由足够了吧 ...

  6. delphi 线程教学第一节:初识多线程

    第一节:初识多线程   1.为什么要学习多线程编程?   多线程(多个线程同时运行)编程,亦可称之为异步编程. 有了多线程,主界面才不会因为耗时代码而造成“假死“状态. 有了多线程,才能使多个任务同时 ...

  7. 多线程的基本概念和Delphi线程对象Tthread介绍

    多线程的基本概念和Delphi线程对象Tthread介绍 作者:xiaoru    WIN 98/NT/2000/XP是个多任务操作系统,也就是:一个进程可以划分为多个线程,每个线程轮流占用CPU运行 ...

  8. Delphi线程的终止

    当线程对象的Execute()执行完毕,我们就认为此线程终止了.这时候,它会调用Delphi的一个标准例程EndThread(),这个例程再调用API函数ExitThread().由ExitThrea ...

  9. Delphi线程基础知识

    参考http://blog.chinaunix.net/uid-10535208-id-2949323.html 一.概述 Delphi提供了好几种对象以方便进行多线程编程.多线程应用程序有以下几方面 ...

  10. Delphi 线程同步技术(转)

    上次跟大家分享了线程的标准代码,其实在线程的使用中最重要的是线程的同步问题,如果你在使用线程后,发现你的界面经常被卡死,或者无法显示出来,显示混乱,你的使用的变量值老是不按预想的变化,结果往往出乎意料 ...

随机推荐

  1. java object 转为 json

    JSONObject jsonObject=JSONObject.fromObject(map) 执行到这的时候没有任何反应的原因及解决办法 http://blog.csdn.net/tjcyjd/a ...

  2. 端口被sysmtem占用

    今天启动Apache的时候老是提示失败,很简单,使用 netstat -ano 发现80端口被占用.如图所示:

  3. Spring -- aop, 用Aspectj进行AOP开发

    1. 概要 添加类库:aspectjrt.jar和aspectjweaver.jar 添加aop schema. 定义xml元素:<aop:aspectj-autoproxy> 编写jav ...

  4. B/S,C/S简单介绍

    B/S,C/S 架构 硬件环境不同:C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务. B/S 建立在广域网之上的, 不必是专门的网络硬件环境, ...

  5. 【sparkStreaming】kafka作为数据源的生产和消费

    1.建立生产者发送数据 (1)配置zookeeper属性信息props (2)通过 new KafkaProducer[KeyType,ValueType](props) 建立producer (3) ...

  6. Caffe初试

    1.基本概念 Caffe是一个比较流行的神经网络框架,它支持C++.Python等语言,容易上手,但是代码貌似不怎么好读,等有空我...;) 2.Windows10下的部署 我把我Windows下的编 ...

  7. 常见CSS浏览器兼容性问题与解决方案【转载自http://blog.csdn.net/chuyuqing/article/details/37561313/】

    所谓的浏览器兼容性问题,是指因为不同的浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情况.在大多数情况下,我们的需求是,无论用户用什么浏览器来查看我们的网站或者登陆我们的系统,都应该是统一的 ...

  8. 蓝牙(cc2540) 协议栈 学习一

    ---------------------------------------------------------- app ------------------------------------- ...

  9. jqueryDom操作

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  10. 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 ...