00001 /* 00002 * CntmLib - Подсчет ссылок, потоки, синхронизация, асинхронные процедуры, события 00003 * Copyright (c) 2005, Овсеевич Роман, CntmLib@mail.ru 00004 * _______________________________________________________________________________ 00005 * Разрешено свободное использование, копирование, распространение, изменение 00006 * (изменение сведений об авторских правах запрещено). Запрещена продажа и 00007 * включение всей библиотеки или ее частей в другие библиотеки. В сведениях об 00008 * авторских правах на программу (или сведениях о программе, об авторах, 00009 * использованных средствах разработки и т.д.) должна быть указана информация 00010 * о библиотеке CntmLib, ее авторе и, возможно, сайте или email'е. 00011 * Библиотека поставляется "как есть", без каких-либо гарантий со стороны автора. 00012 */ 00013 00014 #ifndef CNTM_EXECUTIONUNIT_H 00015 #define CNTM_EXECUTIONUNIT_H 00016 #include <Cntm/Concurrency/Internal/ExecutionUnitImpl.h> 00017 #include <Cntm/Concurrency/ExecutionUnitHandle.h> 00018 00019 namespace Cntm 00020 { 00021 00022 /** 00023 * Базовый класс единицы выполнения программы. Единица выполнения это код, выполняющийся, в определенной степени, автономно (по времени) от кода, создавшего единицу выполнения. 00024 * 00025 * К единицам выполнения относятся асинхронные процедуры (см. класс Cntm::AsyncProc) и потоки активных объектов (см. классы Cntm::ActiveObject и Cntm::ActiveThread). Асинхронные процедуры позволяют отложить выполнение метода объекта на будущее (предварительно подготовив аргументы метода). Активные объекты - это объекты, способные по своей воле в любой момент времени выполнять некоторые действия, т.е. обладающие своими собственными потоками выполнения. В качестве асинхронных процедур и потоков активных объектов выступают методы объектов (т.е. не статические методы) с переданными им аргументами, которые указываются при создании единиц выполнения. 00026 * 00027 * Класс Cntm::ExecutionUnit предоставляет базовый сервис для единиц исполнения - средства проверки принудительного завершения единицы выполнения. Это статические методы Terminated() и CheckTerminating(), которые следует вызывать из контекста единицы выполнения. 00028 * 00029 * Взаимодействие с единицами выполнения производится через их хэндлы, которые возвращаются при создании единиц выполнения. Базовый класс хэндла - Cntm::ExecutionUnitHandle. Он предоставляет возможность сообщать единицам выполнения связанным с ним о принудительном завершении. Хэндлы асинхронных процедур имеют дополнительные возможности. 00030 * 00031 * Класс поддерживает многопоточность. 00032 * @author Овсеевич Р. 00033 * \ingroup Concurrency 00034 */ 00035 class ExecutionUnit 00036 { 00037 public: 00038 00039 /** 00040 * Возвращает значение флага Terminated - принудительный останов единицы выполнения. Если флаг установлен, то это означает, что был послан сигнал на принудительное завершение через хэндл, связанный с единицей выполнения. Если флаг установлен, то единица выполнения должна начать завершение выполнения. 00041 * 00042 * Это статический метод, который должен вызываться из контекста единицы выполнения, т.е. в процессе выполнения асинхронной процедуры или потока активного объекта. Если происходит вложенный запуск единиц выполнения, то значение возвращается для текущей единицы выполнения. Если текущий контекст - не единица выполнения (например, поток, созданный другими средствами), то всегда будет возвращаться false. 00043 */ 00044 static bool Terminated() 00045 { 00046 return SpecUtils::ExecutionUnitImpl::GetCurrentImpl()? 00047 SpecUtils::ExecutionUnitImpl::GetCurrentImpl()->Terminated() : false; 00048 } 00049 00050 /** 00051 * Проверяет значение флага Terminated, и если он установлен, то генерирует исключение базовым классом которого является Cntm::TerminatingSignal. Реальный класс исключения м.б. либо Cntm::ActiveThreadTerminatingSignal либо Cntm::AsyncProcTerminatingSignal в зависимости от того, в чьем контексте был вызван этот метод. Если произошло исключение, то это означает, что был послан сигнал на принудительное завершение через хэндл, связанный с единицей выполнения. Можно не перехватывать это исключение, тогда единица выполнения авершится автоматически, если нужно выполнить завершающие действия, то его следует перехватить перед выходом из метода, соответствующего единице выполнения. 00052 * 00053 * Это статический метод, который должен вызываться из контекста единицы выполнения, т.е. в процессе выполнения асинхронной процедуры или потока активного объекта. Если происходит вложенный запуск единиц выполнения, то значение возвращается для текущей единицы выполнения. Если текущий контекст - не единица выполнения (например, поток, созданный другими средствами), то ни каких действий не выполняется. 00054 * 00055 * Исключение: TerminatingSignal (его потомки Cntm::ActiveThreadTerminatingSignal либо Cntm::AsyncProcTerminatingSignal) если флаг Terminated установлен. 00056 */ 00057 static void CheckTerminating() 00058 { 00059 if (SpecUtils::ExecutionUnitImpl::GetCurrentImpl()) 00060 SpecUtils::ExecutionUnitImpl::GetCurrentImpl()->CheckTerminating(); 00061 } 00062 }; 00063 00064 } 00065 00066 #endif //CNTM_EXECUTIONUNIT_H
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой 1.5.3 |