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

Похоже, это что-то из нового. Для старого варианта потоков:

Поток:
Код:
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 только усложнят понимание сути, так что это сделано намеренно.
Ответить с цитированием