Ну незнаю... я многопоточности в кламе не замечал...
Сейчас я использую следующий код для поиска НЕХ строки, может в нем можно чего ускорить???
Код:
type SBMTable = array [0..255] of Byte;
...
procedure MakeBMTableEx( var BMT : SBMTable; const P : array of byte; Len: integer);
var
I : Byte;
begin
for i := 0 to 255 do BMT[i] := Len;
for i := Len downto 0 do
if BMT[(P[i])] = Len then
BMT[(P[i])] := Len - i;
end;
function BMSearchEx( StartPos : Integer; const S, P : array of byte; const BMT : SBMTable) : Integer;
var
Pos, lp : INTEGER;
I : INTEGER;
begin
lp := Length(P)-1;
Pos := StartPos + lp -1;
while Pos < Length(S) do
if P[lp] <> S[Pos] then
Pos := Pos + BMT[S[Pos]]
else for i := lp - 1 downto 0 do
if P[i] <> S[Pos - lp + i] then
begin
Inc(Pos);
Break;
end
else if i = 1 then
begin
Result := Pos - lp + 1;
Exit;
end;
Result := -1;
end;
function SearchInFileEx(Hex: AnsiString): integer;
var
I : BYTE;
MB : SBMTable;
InputArrayLength: BYTE;
InputArray : Buffer;
B : integer;
begin
InputArrayLength := Length(Hex) div 2;
SetLength(InputArray,InputArrayLength);
for I := 0 to Length(InputArray)-1 do
InputArray[i]:=StrToInt('$'+Copy(Hex, (I+1) * 2 - 1, 2));
MakeBMTableEX(MB,InputArray,Length(InputArray)-1);
B := BMSearchEx(0,BUF,InputArray,MB);
if B > -1 then Result := B
else Result := -1;
Finalize(InputArray);
end;
...
procedure TForm1.Button1Click(Sender: TObject);
var
I,T,T1: integer;
B: integer;
begin
T := GetTickCount;
FS := TMemoryStream.Create;
FS.LoadFromFile(Edit1.Text);
SetLength(BUF,FS.size);
FS.Read(BUF[0],FS.SIZE);
for i := 0 to 1000 do begin
searchinfileex(Edit2.Text); //Edit2 - НЕХ строка...
Label1.Caption := inttostr(i);
Update;
end;
B := searchinfileex(Edit2.Text);
if B > 0 then
Memo1.Lines.Add('Find at pos: '+inttostr(B))
else
Memo1.Lines.Add('Not Find');
FS.Free;
Finalize(BUF);
T1 := GetTickCount;
Memo1.Lines.Add('Speed :' + inttostr(t1-t)+'ms');
end;