Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2009, 00:49   #1
Novasty
Новичок
Джуниор
 
Регистрация: 07.12.2009
Сообщений: 1
По умолчанию Многопоточное вычисление числа Пи

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

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Math;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    RadioButton4: TRadioButton;
    RadioButton5: TRadioButton;
    function X(Param :pointer):real;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


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;
  DeleteCriticalSection(FLock);  
  for i:=1 to 16 do
    CloseHandle(Thr[i]);

  Edit2.Text:=FloatToStr(Pi);
end;

end.

Выдает нулевой результат и System Error. Code: 5, где косяк?
Novasty вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычисление числа пи Maniac.Den Помощь студентам 2 30.11.2009 14:42
ВЫчисление дробей по модулю целого числа Камикадзе Помощь студентам 0 18.04.2009 09:29
Вычисление числа Е и arcsin или arccos qip2005 Паскаль, Turbo Pascal, PascalABC.NET 10 08.12.2008 10:36
Многопоточное программирование madmax08 Общие вопросы .NET 4 15.07.2008 23:58
Вычисление факториала числа PAVEL315 Общие вопросы Delphi 17 21.03.2007 07:32