используя 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);
Два вопроса:
- Я не понимаю, что не так с этим кодом и что означает ошибка «monitor».
- Как я могу заставить задачу 1 правильно запустить задачу 2 и перезапустить ее, если задача 2 завершена?
Заранее спасибо