Смотреть Task2, используя Task1 - перезапустить, если остановлен - PullRequest
0 голосов
/ 07 января 2019

используя OmniThreadLibrary Я хотел бы посмотреть задачу 2, используя другую задачу 1, чтобы определить, остановлена ​​ли задача 2 или иным образом завершена. Цель состоит в том, чтобы перезапустить задачу 2, если она остановилась по какой-либо причине. Пока нет, я использую следующую конструкцию:

  Task1 := CreateTask(
    procedure(const mTask: IOmniTask)
    begin
      while not mTask.Terminated do
      begin
        Sleep(1000);
        // create Task2 and run it, if it is not running
        if Task2 = nil then
        begin
          Task2 := CreateTask(
            procedure(const mTask: IOmniTask)
            begin
              while not mTask.Terminated do
              begin
                Sleep(1000);
              end;
            end)
            .OnTerminated(procedure(const mTask: IOmniTaskControl)
              begin
                Task2 := nil;
              end);
          Task2.Run;
        end;
      end;
    end)
    .OnTerminated(
      procedure(const mTask: IOmniTaskControl)
      begin
        Task1 := nil;
      end);
  Task1.Run;

Если я попытаюсь завершить внутреннюю задачу2 этим кодом

Task2.Terminate(10000);

Я получаю следующую ошибку:

TOmniEventMonitorPool.Release: монитор не выделен для потока ххх.

Тот же код хорошо работает с задачей 1:

Task1.Terminate(10000);

Два вопроса:

  1. Я не понимаю, что не так с этим кодом и что означает ошибка «monitor».
  2. Как я могу заставить задачу 1 правильно запустить задачу 2 и перезапустить ее, если задача 2 завершена?

Заранее спасибо

...