Библиотека CntmLib C++  :: Активные объекты (пакет Cntm.ActiveObjects)
Документация
  • Знакомство с CntmLib
  • Общие сведения
  • Установка и использование
  • Основные пакеты
  • Вспомогательные пакеты
  • Лицензия
  • Описание классов
  • НАЗНАЧЕНИЕ АКТИВНЫХ ОБЪЕКТОВ

    Активный объект - это объект, способный по своему желанию в любой момент времени активизировать операции, в том числе и операции других объектов. Активные объекты имеют свои собственные потоки выполнения.

    Основой активного объекта является класс Cntm::ActiveObject, выполняющий операции по созданию потоков активного объекта и их автоматическому завершению при уничтожении объекта. Активные объекты являются ссылочными объектами. Важной особенностью активных объектов является то, что поток активного объекта не хранит ссылок на сам объект (в отличие от асинхронных процедур), т.е. работа потока не препятствует уничтожению объекта. Когда на объект не осталось ссылок, он посылает всем своим потокам сигнал завершения и ожидает их завершения. Только после завершения всех потоков будут вызваны деструкторы, а для классов ...RefBaseEx - методы OnReleaseInstance().

    Класс Cntm::ActiveObject является основой, но не может служить базовым классом, т.к. не содержит реализации подсчета ссылок. Для создания класса активного объекта он должен быть унаследован от одного из четырех базовых классов: Cntm::ActiveRefBase, Cntm::ActiveRefBaseEx, Cntm::ActiveSynchroRefBase или Cntm::ActiveSynchroRefBaseEx. Первые два объединяют свойства активных объектов с соответствующей реализацие подсчета ссылок, вторые - добавляют к этому средства синхронизации.

    Поток можно создавать либо через средства Cntm::ActiveObject либо с помощью класса потока активного объекта - Cntm::ActiveThread. Поток активного объекта является единицей выполнения (наследует Cntm::ExecutionUnit), поэтому взаимодействие с потоком происходит через хэндл потока - класс Cntm::ActiveThreadHandle. Хэндл позволяет остановить поток до уничтожения активного объекта.

    В потоковых методах для защиты от перехода объекта в удаляемое состояние следует применять Using-объекты - Cntm::Using, Cntm::UsingSync и Cntm::UsingReentrantSync . Последние 2, а также классы Cntm::Sync и Cntm::ReentrantSync могут применяться активными синхрообъектами для входа в свое синхропространство.

     

    ПРИМЕР ИСПОЛЬЗОВАНИЯ

    Пример содержит простейшую реализацию активного синхрообъекта, а также раскрывает некоторые особенности использования активных синхрообъектов.

    Класс активного синхрообъекта

    class ActiveClass1: public ActiveSynchroRefBase
    {
    public:
        typedef RefPtr<ActiveClass1> Ptr;
    
        Start(string text1, int c)
        {
            // Создаем c потоков. Потоку можно передавать любые аргументы.
            for (int i = 0; i < c; i++)
                StartThread(&ActiveClass1::MyThread)(text, i);
        }
    
    private:
        void MyThread(string text, int i)
        {
            while (!ActiveThread::Terminated())
            {
                cout << text << i << endl;
                sleep(1);
            }
        }
    };

    Использование активного синхрообъекта

    int main(int argc, char **argv)
    {
        QTMainSynchroSpace::Application app(argc, argv);
        
        /* Создание главного окна ... */
        
        // Создаем активный объект, запускаем 4 потока.
        ActiveClass1::Ptr p(new ActiveClass1);
        p->Start("Активный объект еще жив", 4);
        
        // Запускаем приложение.
        return app.exec();
        
        // Перед выходом из функции main происходит следующее:
        // 1. Срабатывает деструктор p, что приводит к уничтожению активного объекта,
        // т.к. больше на него никто не указывает. Это, в свою очередь, приводит к
        // автоматической посылке всем потокам активного объекта сигнала останова.
        // 2. В деструкторе объекта приложения app происходит ожидание
        // уничтожения всех синхрообъектов. Т.о. выход из программы произойдет тогда,
        // когда отработает деструктор активного объекта, а деструктор отработает 
        // только после завершения всех потоков активного объекта.
    }

     

    СМ.

  • Основа классов активных объектов Cntm::ActiveObject
  • Базовые классы обычных активных объектов Cntm::ActiveRefBase, Cntm::ActiveRefBaseEx
  • Базовые классы активных синхрообъектов Cntm::ActiveSynchroRefBase, Cntm::ActiveSynchroRefBaseEx
  • Класс потока активного объекта Cntm::ActiveThread
  • Класс хэндла потока активного объекта Cntm::ActiveThreadHandle
  • Тестовый пример ActiveExp.cpp

  • Главная :: Документация :: Описание классов :: Download 

    © 2005, Овсеевич Р.В.
    SourceForge.net Logo