Показать сообщение отдельно
  #8  
Старый 11.03.2008, 04:55
Vlad_88 Vlad_88 вне форума
Прохожий
 
Регистрация: 29.02.2008
Сообщения: 8
Репутация: 10
По умолчанию

Ну незнаю... я многопоточности в кламе не замечал...
Сейчас я использую следующий код для поиска НЕХ строки, может в нем можно чего ускорить???

Код:
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;
Ответить с цитированием