IOCP做的高效率线程池类源码:GThreadPool 本帖最后由 GuestCode 于 2009-10-16 01:13:14 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, GThreadPool, ADODB, ActiveX, ExtCtrls;type TMyThreadPool = class(TGThreadPool) protected procedure OnRun(pData: Pointer; Sender, wParam, lParam: DWord); override; procedure OnThreadBegin(Thread: DWord); override; procedure OnThreadEnd(Thread: DWord); override; end; TForm1 = class(TForm) Button1: TButton; Timer1: TTimer; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } protected public { Public declarations } FRunCount: Integer; end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);var TP: TMyThreadPool; i: Integer;begin FRunCount := 0; TP := TMyThreadPool.Create(4); for i := 1 to 1000000 do TP.PostQueue(DWORD(Self), 0, 0); TP.Destroy();end;{ TMyThreadPool }procedure TMyThreadPool.OnRun(pData: Pointer; Sender, wParam, lParam: DWord);var DBC: TADOConnection;begin DBC := TADOConnection(pData); //做数据库处理 InterlockedIncrement(TForm1(Sender).FRunCount);end;procedure TMyThreadPool.OnThreadBegin(Thread: DWord);var DBC: TADOConnection;begin //线程内初始化数据库,并创建数据库会话 CoInitialize(nil); DBC := TADOConnection.Create(nil); //如果还有TQuery,请定义数据结构,把数据结构指针传给SetData SetData(Thread, DBC);end;procedure TMyThreadPool.OnThreadEnd(Thread: DWord);begin TADOConnection(GetData()).Destroy(); CoUninitialize();end;procedure TForm1.Timer1Timer(Sender: TObject);begin Caption := IntToStr(FRunCount);end;procedure TForm1.FormCreate(Sender: TObject);begin FRunCount := 0;end;end. 自己编写的软件如何做30天试用期的功能? 下面代码如何简化比较合理 简单问题,怎样在TDBGridEh的Footer中显示当前记录数? 使用MSCOMM接收字符不全的问题 会编网络浏览器的高手请进 以前用过一个可恢复硬盘已删除数据的软件,忘了叫什么名字了,大家那位知道,急用!(在线) 800分!求四角号码输入法的开发 怎么创建一个新窗口? 谁能告诉我Tstrings和TstringList有什么区别吗?他们都可以存储a list of strings.有什么不同吗? 请高手指点???!!! delphi+sqlserver2000数据库的字段加密问题寻求解决办法 加密PDF
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, GThreadPool, ADODB, ActiveX, ExtCtrls;type
TMyThreadPool = class(TGThreadPool)
protected
procedure OnRun(pData: Pointer; Sender, wParam, lParam: DWord); override;
procedure OnThreadBegin(Thread: DWord); override;
procedure OnThreadEnd(Thread: DWord); override;
end; TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
protected public
{ Public declarations }
FRunCount: Integer;
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
TP: TMyThreadPool;
i: Integer;
begin
FRunCount := 0;
TP := TMyThreadPool.Create(4);
for i := 1 to 1000000 do
TP.PostQueue(DWORD(Self), 0, 0);
TP.Destroy();
end;{ TMyThreadPool }procedure TMyThreadPool.OnRun(pData: Pointer; Sender, wParam,
lParam: DWord);
var
DBC: TADOConnection;
begin
DBC := TADOConnection(pData);
//做数据库处理
InterlockedIncrement(TForm1(Sender).FRunCount);
end;procedure TMyThreadPool.OnThreadBegin(Thread: DWord);
var
DBC: TADOConnection;
begin
//线程内初始化数据库,并创建数据库会话
CoInitialize(nil);
DBC := TADOConnection.Create(nil);
//如果还有TQuery,请定义数据结构,把数据结构指针传给SetData
SetData(Thread, DBC);
end;procedure TMyThreadPool.OnThreadEnd(Thread: DWord);
begin
TADOConnection(GetData()).Destroy();
CoUninitialize();
end;procedure TForm1.Timer1Timer(Sender: TObject);
begin
Caption := IntToStr(FRunCount);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
FRunCount := 0;
end;end.