• Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

  • Пользаватели которые будут спамить, уходят в бан без предупреждения. Спам сообщения определяется администрацией и модератором.

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

Delphi TThread delphi TTask

  • Автор темы Автор темы Lomanu4
  • Дата начала Дата начала

Lomanu4

Команда форума
Администратор
Регистрация
1 Мар 2015
Сообщения
1,467
Баллы
155


Библиотека параллельного программирования (PPL) предоставляет класс TTask для параллельного запуска одной или нескольких задач. Задача представляет собой единицу работы , которую нужно сделать. PPL выполняет связь между задачей и потоком, который выполняет задачу, поэтому вы можете выполнять несколько задач параллельно, не создавая собственных потоков и не управляя ими.

TTask создает и управляет взаимодействием с экземплярами ITask . ITask - это интерфейс, который предоставляет ряд методов и свойств для запуска , ожидания , отмены, а также свойства для состояния (создано, WaitingToRun, выполняется, завершено, WaitingForChildren, отменено, исключение).

TTask предоставляет WaitForAll и WaitForAny для ожидания завершения всех или любых задач. WaitForAll возвращает, когда все задачи завершены, тогда как WaitForAny сообщает вам о первой выполненной задаче . Например, если у вас есть две задачи A и B, которые занимают 3 и 5 секунд соответственно, время для получения результата:

В следующем примере используется метод WaitForAll :

Код:
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;
Другая функция TTask - предотвращение блокировки пользовательского интерфейса, если вы хотите запустить что-то в фоновом режиме. В следующем примере кода показано, как запустить одну задачу и запустить ее:
Код:
procedure TFormThreading.Button1Click(Sender: TObject);
var
 aTask: ITask;
begin
 aTask := TTask.Create (procedure ()
   begin
     sleep (3000); // 3 seconds
     ShowMessage ('Hello');
   end);
 aTask.Start;
end;
TTaskStatus = (Created, WaitingToRun, Running, Completed, WaitingForChildren, Canceled, Exception);
Код:
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;
 
Вверх Снизу