测试了一下,在一个delphi开发的应用程序中,最多只能创建16个有效的timesetevent。以下是测试代码,大家可以试试,不知道这个怎么解决,郁闷。怪不得我上面的线程只要超过16个后,第17个线程虽然创建了,但是就是不定时采集数据,原因在此,至于怎么解决,我也在看msdn,如果有遇到这个问题的大侠,麻烦指点一下,谢谢。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, mmsystem, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
timerid: array [1..20] of integer;
htimerevent:array [1..20] of Thandle;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
begin
for I := 1 to 20do
begin
htimerevent := CreateEvent(nil, False, False, nil);
timerid := timesetevent(I*1000,0,TFNTimecallback(htimerevent),0,time_periodic or time_callback_event_set);
memo1.Lines.Add(inttostr(timerid)+ ' '+'getlasterror:'+ inttostr(getlasterror()));
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
I: Integer;
begin
for I := 1 to 20do
begin
timekillevent(timerid);
CloseHandle(htimerevent);
end;
end;
上面的程序返回的结果如下:(当然,每次返回的值是不一样的,但是后面四个都是0,这个结果也验证了问题的所在。)
16 getlasterror:0
33 getlasterror:0
50 getlasterror:0
67 getlasterror:0
84 getlasterror:0
101 getlasterror:0
118 getlasterror:0
135 getlasterror:0
152 getlasterror:0
169 getlasterror:0
186 getlasterror:0
203 getlasterror:0
220 getlasterror:0
237 getlasterror:0
254 getlasterror:0
271 getlasterror:0
0 getlasterror:0
0 getlasterror:0
0 getlasterror:0
0 getlasterror:0
end.