Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно
pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Можно код? Я не понял.

Очередь заданий:
Код: Выделить весь код
// класс задание или действие
class TAction
{
public: 
     virtual ~TAction() {}
     virtual void fire() = 0;
};

// список заданий (exception-safe)
class TActionList
{
    typedef std::vector<TAction*>::iterator iter;
    std::vector<TAction*> fitems;

    void _remove(iter a, iter b)
    {
         for(iter c=a; a!=b; ++c) delete *c;
         fitems.erase(a,b);
    }

public:
   ~TActionList() {clear();}
   void add(TAction* a) {fitems.push_back(a);}
   void remove(TAction* a) {_remove(std::remove(fitems.begin(), fitems.end(), a));}
   void clear() {_remove(fitems.begin(), fitems.end());}
   void fire() {for(iter a=fitems.begin(), b=fitems.end(); a!=b; ++b) (*a)->fire();}
};

// класс, управляющий жизнью объектов
// TObject::execute() можно вызывать только один раз при запуске программы
class TObject
{
    static TActionList fcleanup;
    static void processTasks();
    static void cleanup() {fcleanup.fire(); fcleanup.clear();}
public:
    static void execute();
    static void registerCleanup(TAction* a) {fcleanup.add(a);}
}

TActionList TObject::fcleanup;

void TObject::execute()
{
     while (waitTask())
    {
           processTasks();  // каким-нибудь образом вызывает A::foo();
           cleanup();   // такой доступ к cleanup() гарантирует, что в стеке ничего от A:: не запущено
    }
}

...
// где-нибудь в программе:
std::auto_ptr<A> behavior;

void A::foo()
{
     struct cleanup_A
     {
           void fire() { clog << "cleanup_A" << end;}
           cleanup_A(A* a) : fcleanup(a);
      private:
           std::auto_ptr<A> fcleanup;
     }

     std::auto_ptr<A> b(new B(...));
     std::auto_ptr<cleanup_A> clean_a(new cleanup_A(behavior.get()));
     TObject::registerCleanup(clean_a.get());

     clean_a.release();   // non-throwing
     behavior.release();  // non-throwing
     behavior = b;           // non-throwing
}
Эффект кода подобен чистильщику java, только чистит когда делать нечего, а не когда память кончилась
Для полной картины, хорошо бы добавить A::unlink(), которая убирает связи ещё живого A с другими объектами.

Отправлено: 13:11, 16-11-2005 | #8