Mutex.TerminateThread

From SunFlurry wiki
Revision as of 08:51, 7 February 2021 by Admin (talk | contribs) (1 revision imported)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
  TerminateThread (Работа с подчиненными потоками)
Объект:Семафор
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в число, неверный объект
Визуальность:Нет

Функция безусловно завершает выполнение подчиненного потока, без ожиданием окончания завершения, если необходимо. При завершении потока, будут выполнены все вложенные конструкции Finally, как будто поток был завершен по требованию пользователя. Разница между режимом ожидания завершения и завершением без ожидания заключается в том, что в обоих случаях функция выставляет для потока флаг того, что он должен быть завершен, однако, в режиме ожидания, она еще и дожидается того момента, когда поток выполнит все блоки Finally, завершит все освобождение памяти и закончит выполнение. Если поток уже завершен, функция не выполняет никаких действий.

Синтаксис

Mutex.TerminateThread(<Без ожидания (INT)>=0)

Аргументы

  • <Без ожидания (INT)> - (необязательный аргумент) Может принимать следующие значения:
    • 0 (по умолчанию) -- ожидать полного завершения потока.
    • 1 -- не ожидать завершения потока, только передать ему флаг завершения.

Примеры

  Function Пример(стрСообщение)
    Try
      Message(стрСообщение+": выполняется тело функции");
      Sleep(1000);
      Message(стрСообщение+": тело функции закончило выполнение");
    Finally
      Message(стрСообщение+": выполняется блок Finally функции");
    EndTry;
  EndFunction


Message("Вызов потока 1");
Mutex.ExecuteFunctionInSeparateThread("Пример",0,"Без завершения");
Message("Окончание вызова потока 1");

Message("Вызов потока 2");
Mut:=Mutex.ExecuteFunctionInSeparateThread("Пример",0,"С ожиданием завершения");
//Пауза для того, чтобы функция начала выполняться (иначе блок Finally может быть пропущен из-за TerminateThread)
Sleep(10);
Mut.TerminateThread(0);
Message("Окончание вызова потока 2");

Message("Вызов потока 3");
Mut:=Mutex.ExecuteFunctionInSeparateThread("Пример",0,"Без ожидания завершения");
//Пауза для того, чтобы функция начала выполняться (иначе блок Finally может быть пропущен из-за TerminateThread)
Sleep(10);
Mut.TerminateThread(1);
Message("Окончание вызова потока 3");
//В результате в лог будет выведено:
//"Вызов потока 1"
//"Окончание вызова потока 1" -- Программа продолжает выполнение, пока подчиненный поток выполняет инициализацию
//"Вызов потока 2"
//"Без завершения: выполняется тело функции" -- Первый поток только сейчас успел выполнить инициализацию
//"С ожиданием завершения: выполняется тело функции" -- Второй поток начал выполняться, в это время первый поток выполняет Sleep, а основной поток ждет выполнения TerminateThread
//"С ожиданием завершения: выполняется блок Finally функции" -- Второй поток получил флаг завершения и выполняет блок ''Finally''
//"Без завершения: тело функции закончило выполнение" -- Первый поток закончил выполнение функции (но не свой блок ''Finally''), в зависимости от системных факторов, этот пункт может быть выше
//"Окончание вызова потока 2" -- Второй поток завершился, продолжается выполнение основного потока
//"Вызов потока 3" -- Создан третий поток
//"Без завершения: выполняется блок Finally функции" -- Первый поток выполняет блок ''Finally'' перед своим завершением, в зависимости от системных факторов, этот пункт может быть выше
//"Без ожидания завершения: выполняется тело функции" -- Третий поток начал выполняться (в этот момент первый и второй потоки уже завершены)
//"Окончание вызова потока 3" -- Основной поток вызвал TerminateThread, которая передала флаг завершения третьему потоку и вернула управление, не дожидаясь фактического завершения
//"Без ожидания завершения: выполняется блок Finally функции" -- Третий поток получил флаг завершения и выполняет блок ''Finally''