Похоже, это что-то из нового. Для старого варианта потоков:
Поток:
Код:
TMyThread = class(TThread)
private
function GetIntegralValue(a, b : Extended) : Double;
public
IsDone : Boolean;
Value : Double;
a, b : Extended;
protected
procedure Execute; override;
end;
...
function TMythread.GetIntegralValue(a, b : Extended) : Double;
begin
// Твоя функция
result := Random * Random(100);
end;
procedure TMythread.Execute;
begin
IsDone := False;
Value := GetIntegralValue(a,b);
IsDone := True;
end;
Основной код:
Код:
var
Result : Double;
N : Integer;
a, b : Extended;
a1, b1 : Extended;
i : Integer;
threads : array Of TMyThread;
f : Boolean;
begin
// интервал
a := ...;
b := ...;
// Кол-во потоков
N := 10;
SetLength(threads,N);
// Создаем и запускаем потоки
For I := 0 To N-1 Do
begin
threads[i] := TMyThread.Create(True);
threads[i].a := a + I*((b-a)/N);
threads[i].b := threads[i].a + ((b-a)/N);
threads[i].FreeOnTerminate := False;
threads[i].Resume;
end;
// Ждем пока все выполнится
sleep(1000); // 1 сек
repeat
f := true;
For I := 0 To N-1 Do
f := f and threads[i].IsDone;
until f;
// все готово, собибаем результат и убиваем потоки
Result := 0;
For I := 0 To N-1 Do
begin
Result := Result + threads[i].Value;
threads[i].Free;
end;
Как-то так.
Вот еще для информации родной пример:
http://docwiki.embarcadero.com/CodeE...epSort_(Delphi)
Можно сделать так, что потоки сами будут через синхронизацию писать результат по переданному адресу, ну и вообще код упростить. Но для общего понимания такой вариант проще.
ЗЫ. Для тех, кто святее папы римского. Я знаю, что код написан довольно грязно. Но лишние строк 20-30 только усложнят понимание сути, так что это сделано намеренно.