- Регистрация
- 1 Мар 2015
- Сообщения
- 1,467
- Баллы
- 155
System.Threading.TTask - RAD Studio API Documentation
System.Threading.TTaskStatus - RAD Studio API Documentation
Библиотека параллельного программирования (PPL) предоставляет класс TTask для параллельного запуска одной или нескольких задач. Задача представляет собой единицу работы , которую нужно сделать. PPL выполняет связь между задачей и потоком, который выполняет задачу, поэтому вы можете выполнять несколько задач параллельно, не создавая собственных потоков и не управляя ими.
TTask создает и управляет взаимодействием с экземплярами ITask . ITask - это интерфейс, который предоставляет ряд методов и свойств для запуска , ожидания , отмены, а также свойства для состояния (создано, WaitingToRun, выполняется, завершено, WaitingForChildren, отменено, исключение).
TTask предоставляет WaitForAll и WaitForAny для ожидания завершения всех или любых задач. WaitForAll возвращает, когда все задачи завершены, тогда как WaitForAny сообщает вам о первой выполненной задаче . Например, если у вас есть две задачи A и B, которые занимают 3 и 5 секунд соответственно, время для получения результата:
- Последовательно (без использования TTask / ITask ) = 8 секунд
- TTask.WaitForAny = 3 секунды
- TTask.WaitForAll = 5 секунд
Код:
procedure TFormThreading.MyButtonClick(Sender: TObject);
var
tasks: array of ITask;
value: Integer;
begin
Setlength (tasks ,2);
value := 0;
tasks[0] := TTask.Create (procedure ()
begin
sleep (3000); // 3 seconds
TInterlocked.Add (value, 3000);
end);
tasks[0].Start;
tasks[1] := TTask.Create (procedure ()
begin
sleep (5000); // 5 seconds
TInterlocked.Add (value, 5000);
end);
tasks[1].Start;
TTask.WaitForAll(tasks);
ShowMessage ('All done: ' + value.ToString);
end;
Код:
procedure TFormThreading.Button1Click(Sender: TObject);
var
aTask: ITask;
begin
aTask := TTask.Create (procedure ()
begin
sleep (3000); // 3 seconds
ShowMessage ('Hello');
end);
aTask.Start;
end;
Код:
listTask: TList<ITask>;
for i := listTask.Count - 1 downto 0 do
begin
if (listTask.Items[i].Status = TTaskStatus.Completed) then
begin
listTask.Delete(i);
end;
end;
listTask.Add(TTask.Create(self.mythread));
listTask.Items[listTask.Count - 1].Start;
Код:
for i := listTask.Count - 1 downto 0 do
begin
if listTask.Items[i].Status in [TTaskStatus.Running, TTaskStatus.Created, TTaskStatus.WaitingToRun] then
begin
while not(listTask.Items[i].Status in [TTaskStatus.Completed, TTaskStatus.Canceled, TTaskStatus.Exception]) do
begin
Sleep(500);
Application.ProcessMessages;
end;
end;
end;
Label1.Text:='disConnect OK!!'
Код:
for i := listTask.Count - 1 downto 0 do
begin
listTask.Items[i].wait(5000);
end;