关于CreateThread多线程的内存管理,该如何解决
关于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;