Я впечатлен этой библиотекой AsynCalls, разработанной Энди.
Я пишу фрагмент кода, чтобы протестировать библиотеку, но он всегда получает память A/V, я что-то пропустил здесь?
Следующий код предназначен для параллельной этой простой задачи (получить максимум из массива) с использованием двух асинхронных потоков.
program Test;
{$APPTYPE CONSOLE}
uses
SysUtils,
Math,
Windows,
Forms,
AsyncCalls in 'AsyncCalls.pas';
var
arr: array of integer;
i: integer;
procedure GetMax(const arr: array of integer; left, right: integer; var max: integer);
var
i: integer;
begin
max := arr[left];
for i := left + 1 to right do
begin
if (arr[i] > max) then
begin
max := arr[i];
end;
end;
end;
const
N = 100000;
var
a, b: IAsyncCall;
maxv, max1, max2: integer;
begin
SetLength(arr, N);
maxv := -1;
for i := 0 to High(arr) do
begin
arr[i] := RandomRange(0, MaxInt);
if (arr[i] > maxv) then
begin
maxv := arr[i];
end;
end;
a := AsyncCall(@GetMax, [arr, 0, Length(arr) div 2, max1]);
b := AsyncCall(@GetMax, [arr, (Length(arr) div 2) + 1, High(arr), max2]);
while (AsyncMultiSync([a, b], True, 10) = WAIT_TIMEOUT) do
begin
Application.ProcessMessages;
end;
Writeln(max1, ', ', max2, ', ', Max(max1, max2));
Writeln(maxv);
Readln;
end.