Показать сообщение отдельно
  #4  
Старый 09.07.2013, 06:31
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

На самом деле даже последний, четвертый, блок вполне параллелится (ну если действительно надо просто посчитать сумму элементов). Тебе надо сделать 3 потока, каждый из которых вычислит свои элементы и проссумирует их. После окончания работы он, соответственно, просигналит основному потоку о завершении. Основной поток возьмет 3 числа, сложит их и выдаст конечный результат.

Примерно так:
Код:
type
  // Базовый класс для тредов
  TCalcThread = class(TThread)
  private
    FIsDone : Boolean;
    FFrom, FTo : Integer;
    FSum : Integer;
  ...
  public
    constructor Create(AFrom, ATo : Integer); virtual;
    property IsDone : Boolean read FIsDone;
    property Sum : Integer read FSum;
 end;

constructor TCalcThread.Create(AFrom, ATo : Integer);
begin
  inherited Create(False);
  FFrom := AFrom;
  FTo := ATo;
  FIsDone := False;
  FSum := 0;
end;
Далее создаешь 3 треда (T1st, T2nd, T3rd), где в перекрытом методе Execute делаешь все вычисления. В конце присваиваешь значение суммы в поле FSum, а в поле FIsDone присваиваешь True.
Код главного потока:
Код:
var
  t1, t2, t3 : TCalcThread;
  S : Integer;
begin
  t1 := T1st.Create(1, N);
  t2 := T2nd.Create(N+1,N+M);
  t3 := T3rd.Create(N+M+1,N+M+K);
  While True Do
    Begin
      If t1.IsDone And t2.IsDone And t3.IsDone Then
        Begin
           S := t1.Sum + t2.Sum + t3.Sum;
           FreeAndNil(t1);
           FreeAndNil(t2);
           FreeAndNil(t3);
        End;
      Sleep(200);
    End;
  WriteLn('S=',S); // Вывод результата
Ответить с цитированием