ExecutionUnit.h

См. документацию.
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

SourceForge.net Logo
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой  doxygen 1.5.3