На самом деле даже последний, четвертый, блок вполне параллелится (ну если действительно надо просто посчитать сумму элементов). Тебе надо сделать 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); // Вывод результата