Показать сообщение отдельно
  #1  
Старый 07.12.2009, 00:15
Novasty Novasty вне форума
Прохожий
 
Регистрация: 07.12.2009
Сообщения: 3
Репутация: 10
По умолчанию Многопоточное вычисление числа Пи

Очень нужна помощь.
Вот задание:
Написать программу, реализующую многопоточное вычисление числа πи по приближенному алгоритму:
Пи/4=1-1/3+1/5-1/7... с некоторой точностью ε .
Определить и построить зависимость времени расчетов от числа потоков (1, 2, 4, 8,
16 потоков). При данном числе потоков произвести несколько запусков
программы, сравнить результаты, объяснить несоответствие результатов.

Код:
var  Pi: real;
     eps: cardinal;
     N: integer;
     Id: integer;
     FLock     : TRTLCriticalSection;
     gIndex     : integer;
     gIndexSave : integer;

function TForm1.X(Param :pointer):real;
var i: integer;
begin
  EnterCriticalSection(FLock);
  Result:=0;
  i:=Id;
  while i<=Eps do
      Result:=(Power(-1, i+1)*4)/(2*i-1);
      i:=i+N;
  LeaveCriticalSection(FLock);
  Pi:=Pi+Result;
  EndThread(0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var i: cardinal;
    Thr:array[1..16] of cardinal;
    ThreadID: LongWord;
const a=1;
begin
  Pi:=0;
  for i:=1 to 16 do
    Thr[i]:=0;
  Eps:=StrToInt(Edit1.Text);

  if RadioButton1.Checked then
    N:=1;

  if RadioButton2.Checked then
    N:=2;

  if RadioButton3.Checked then
    N:=3;

  if RadioButton4.Checked then
    N:=4;

  if RadioButton5.Checked then
    N:=5;

  InitializeCriticalSection(FLock);
  for i:=1 to N do
    begin
      Id:=i;
      Thr[i]:=BeginThread(nil, 0, @TForm1.X, nil, 0, ThreadID);
    end;

  for i:=1 to 16 do
  begin
    CloseHandle(Thr[i]);
  end;
  Edit2.Text:=FloatToStr(Pi);
end;

Выдает нулевой результат, где косяк?
Ответить с цитированием