Параллельный вызов процедур


Данное решение работает только на многоядерных процессорах,
но имеет большое преимущество в простоте реализации.

Для работы должен быть установлен multithreadprocslaz.lpk

Данная программа при вызове с параметром производит 5 перестановок
ханойской башни в 4 потока параллельно, а без параметров - последовательно.

program hanoy;

uses sysutils,mtprocs;

const HEIGHT = 28;

var CYCLE: double;

procedure replace(k:integer;x,y,z:char);
begin
  if CYCLE>1000 then CYCLE:=CYCLE/2.0;
  if k=1 then
  begin
    CYCLE:=CYCLE+10.0;
    //writeln(x,' => ', y)
  end
  else
  begin
    replace(k-1,x,z,y);
    //writeln(x, ' => ', y);
    CYCLE:=CYCLE+1.0;
    replace(k-1, z,y,x);
  end;
end;

procedure DoSomethingParallel(Index: PtrInt; Data: Pointer; Item: TMultiThreadProcItem);
begin
  writeln('Loop:',Index);
  replace(HEIGHT,'a','c','b');
end;

var x:TDateTime;
    i:integer;
begin
  CYCLE:=1.5;
  x:=time();
  if ParamCount=0 then
    for i:=1 to 8 do
    begin
      writeln('Cycle:',i);
      replace(HEIGHT,'a','c','b');
    end
  else
    ProcThreadPool.DoParallel(@DoSomethingParallel,1,8,nil,4);
  writeln('>',time()*100000-x*100000:2:2);
end.