相关疑难解决方法(0)

为什么WaitForMultipleObjects会因多个线程句柄而失败?

在下面的测试程序中,每个测试线程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)

delphi multithreading delphi-xe2

11
推荐指数
1
解决办法
1243
查看次数

标签 统计

delphi ×1

delphi-xe2 ×1

multithreading ×1