Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Вот не скажи, одни только begin и end как код раздувают по размеру, да и синтаксис объявления функций весьма громоздкий.
var
lParallelDialogCS: TCriticalSection; // Критическая секция на взаимодействие с пользователем из параллельного потока
procedure MainThreadOnly;
begin
Assert(GetCurrentThreadID = MainThreadID, 'Данный участок программы может выполняться только в основном потоке.');
end;
procedure RequestDialog(const aTask: IOmniTask;
aDialogProc: TOmniTaskInvokeFunction);
var
vCompleted: IOmniWaitableValue;
vExc: Exception;
begin
if not Assigned(aTask) then
begin
MainThreadOnly;
aDialogProc;
end
else begin
lParallelDialogCS.Enter;
try
vExc := nil;
vCompleted := CreateWaitableValue;
aTask.Invoke(
procedure
begin
try
aDialogProc;
except
vExc := AcquireExceptionObject;
end;
vCompleted.Signal;
end
);
vCompleted.WaitFor;
if Assigned(vExc) then
raise vExc;
finally
lParallelDialogCS.Leave;
end;
end;
end;
initialization
lParallelDialogCS := TCriticalSection.Create;
finalization
FreeAndNil(lParallelDialogCS);
procedure A;
begin
// Запускаем доп. поток
// ... Что-то делаем ... В это время второй поток хочет сделать Synchronyze
// Ждем завершения второго потока. Вот здесь надо делать ProcessMessages вручную, иначе можно ждать бесконечно
end;
function total_age(x): integer;
var i: integer;
begin
result=0;
try
for i=0 to x.count do result:=result+x[i].age;
except
print('че-то вы мне не то подсунули..');
end;
end;
Библиотека OmniThreadLibrary — простая многопоточность в среде Delphi