delphi 线程的使用
2013-10-29 21:04
337 查看
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-1 downto 0 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>0 then begin AWork:=TWorkItem(FList.Items[0]); FList.Delete(0); 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中创建线程,请一定使用BeginThread()代替CreateThread()创建线程!
- delphi判断线程状态函数(使用GetExitCodeThread API函数去判断线程的句柄)
- 在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程!
- delphi 中使用WaitForMultipleObjects等待线程执行,再执行后续代码
- delphi 中使用WaitForMultipleObjects等待线程执行,再执行后续代码
- Delphi 在线程中如何使用TClientSocket组件并自动检测该组件
- 在非UI线程中更改UI(Delphi使用隐藏窗口来处理,QT使用信号槽)
- delphi 线程使用
- 在Delphi下,使用线程向窗体发送动态数组数据的解决方法~
- 在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程!
- delphi 中使用WaitForMultipleObjects等待线程执行,再执行后续代码
- Delphi中使用Win32 API创建内建消息循环的线程函数
- 在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程!(更好的管理异常)
- 解决使用Delphi的Thread时主线程阻塞
- Delphi插件创建、调试与使用应用程序扩展
- Delphi使用JSON解析调用淘宝IP地址库REST API 示例
- Delphi中回调函数的使用
- java多线程CyclicBarrier使用示例,让线程起步走
- linux下使用c进行线程操作
- Android中使用ListView实现分页刷新(线程休眠模拟)