关于CreateThread多线程的内存管理,该如何解决

关于CreateThread多线程的内存管理
关于CreateThread多线程的内存管理,代码如下,单线程下测试没问题,可是多线程就会出现内存错误,求助这是为什么呢?

unit UMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls,
  Vcl.ExtCtrls, IdHTTP, UMd5, RegularExpressions;

type
  TForm1 = class(TForm)
    ListView1: TListView;
    btnImportAccount: TButton;
    OpenDialog1: TOpenDialog;
    edtThreadNumber: TEdit;
    btnTaskStart: TButton;
    Label1: TLabel;
    Label2: TLabel;
    edtAgent: TEdit;
    procedure btnImportAccountClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure btnTaskStartClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TParam = ^Param;

  Param = record
    i: Integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure ImportAccount(Path: string);
var
  str, substr: TStringList;
  i: Integer;
  item: TListItem;
begin
  str := TStringList.Create;
  str.LoadFromFile(Path);

  for i := 0 to str.Count - 1 do
  begin
    substr := TStringList.Create;
    ExtractStrings(['-', '-', '-', '-'], [], PWideChar(str.Strings[i]), substr);
    item := Form1.ListView1.Items.Add;
    item.Caption := substr.Strings[1];
    item.SubItems.Add(substr.Strings[2]);
    item.SubItems.Add('');
    substr.Free;
  end;
  str.Free;
end;

procedure TForm1.btnImportAccountClick(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    ImportAccount(OpenDialog1.FileName);
  end;
end;

var
  ThreadNumber: Integer;

procedure ThreadWork(parms: TParam); stdcall;
var
  HTTP: TIdHTTP;
  User, Pass, ReturnText, ErrorText: string;
  Match: TMatchCollection;
begin
  User := Form1.ListView1.Items[parms^.i].Caption;
  Pass := Form1.ListView1.Items[parms^.i].SubItems[0];
  HTTP := TIdHTTP.Create();
  // HTTP.ProxyParams.ProxyServer:='';
  ReturnText := HTTP.Get
    ('http://reg.gyyx.cn/Login/Async?jsoncallback=jQuery1720860943458336865_1391002389641&Account='
    + User + '&Password=' + LowerCase(StrToMD5(Pass)) +
    '&Captcha=&undefined=&r=0.7550008860546462&_=1391002402093');

  Match := TRegEx.Matches(ReturnText, '"Message":(.*),"Account"');
  ErrorText := Match.item[0].Groups[1].Value;
  if ErrorText = 'null' then
  begin
    Form1.ListView1.Items[parms^.i].SubItems[1] := '密码正确';
  end
  else
  begin
    Match := TRegEx.Matches(ErrorText, '"(.*)"');
    Form1.ListView1.Items[parms^.i].SubItems[1] := Match.item[0].Groups[1].Value;
  end;

  ThreadNumber := ThreadNumber - 1;
end;

procedure ThreadBoss;
var
  MaxThreadNumber, i: Integer;
  hThread: Cardinal;
  p: TParam;
  pp:Pointer;
begin
  // 初始化变量
  MaxThreadNumber := StrToInt(Form1.edtThreadNumber.Text);
  ThreadNumber := 0;
  i := 0;

  while i < Form1.ListView1.Items.Count do
  begin
    if ThreadNumber < MaxThreadNumber then
    begin
      New(p);
      p^.i := i;
      CreateThread(nil, 0, @ThreadWork, p, 0, hThread);
      ThreadNumber := ThreadNumber + 1;
      i := i + 1;
      Sleep(5);
    end
    else
    begin
      Sleep(1000);
    end;