在下面的测试程序中,每个测试线程TThreadList在开始执行时将其句柄添加到全局,并在其执行即将结束时从同一列表中删除其句柄.
另外,为了测试目的,每个线程确保在主线程锁定列表之前添加其句柄(复制它们的句柄并开始等待它们完成).线程还确保在主线程锁定列表之前不删除它们的句柄.
测试程序运行良好,最多可达50-60个线程.之后,WaitForMultipleObjects调用开始失败WAIT_FAILED,GetLastError返回87(ERROR_INVALID_PARAMETER).目前它启动了100个线程.我的问题是,我做错了什么?
该程序使用XE2编译 - 更新4,32位目标平台.测试盒是W7x64.
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
windows,
sysutils,
classes,
syncobjs;
type
TTestThread = class(TThread)
private
FAckStarted: TEvent;
function GetAckHandle: THandle;
class var
ThreadList: TThreadList;
WaitEnd: THandle;
protected
procedure Execute; override;
public
constructor Create;
destructor Destroy; override;
property AckHandle: THandle read GetAckHandle;
end;
{.$DEFINE FREEONTERMINATE}
constructor TTestThread.Create;
begin
inherited Create(True);
FAckStarted := TEvent.Create;
{$IFDEF FREEONTERMINATE}
FreeOnTerminate := True;
{$ENDIF}
end;
destructor TTestThread.Destroy;
begin
FAckStarted.Free; …Run Code Online (Sandbox Code Playgroud)