Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > базовый класс поток


Автор: cthutq 3.4.2007, 21:14
борюсь тут с потоками и получилось примерно следующее
Код

class BoostThread : private boost::noncopyable {
private :
    boost::thread m_thread;

public :
    explicit BoostThread (const boost::function0<void>& func)
        : m_thread (func) {;}
    ~BoostThread () { m_thread.join(); }

    static void sleep (unsigned msec);
};
/* -------------------------------------------------------------------------- */
class IThread : private boost::noncopyable
                /*public boost::enable_shared_from_this <IThread>*/ {
private :
    friend class Thread;

    volatile bool m_stopped;
    virtual void execute (void) = 0;

    void mainThread (void)
                {
                    OnStart ();
                    execute ();
                    OnStop ();
                }

protected :
    bool isStopped (void) const { return m_stopped; }

    IThread () {};

    virtual void OnStart (void) {};
    virtual void OnStop  (void) {};

public :
    virtual ~IThread () = 0;
};
/* -------------------------------------------------------------------------- */
class Thread : private boost::noncopyable {
private :
    IThread& m_ithread;
    boost::scoped_ptr<BoostThread> m_thread;

public :
    explicit Thread (IThread& thread) : m_ithread (thread) {};
    ~Thread () { stop(); }

    void start (void);  // Запускает IThread::mainThread
    void stop  (void); // Убивает его
};



Тоесть достаточно унаследоваться от IThread и с помощью Thread можно запускать поток класса.
Но во проблемма. Как хранить Thread ? Приходится вместе с наследниками IThread.

А как быть если я хочу наследники помещать в контейнер и запускать их ? Тоесть придется тамже
хранить стартеры потоков. Была идея хранить стартеры прям в самих наследниках и выпускать
наружу лишь их интерфейсы. Но как-то криво.

Наследоваться от Thread тоже не получиться - нельзя в списке конструктора использовать *this
А иначе никак не проинициализировать Thread.

Как быть ? И правильна ли вообще архитектура ?

P.S. И хотел в Thread передавать weak_ptr<IThread>, но что-то с enable_shared_from_this <IThread>
не получилось. Когда пытаюсь вызвать shared_from_this () падает с bad_weak_ptr

Может кто знает как правильно ?

Автор: JackYF 4.4.2007, 16:02
Цитата(cthutq @  3.4.2007,  21:14 Найти цитируемый пост)
борюсь тут с потоками


boost::thread уже сам по себе неплохой класс. Что ты хочешь еще привнести туда, в плане функциональности, делая свой собственный класс?

Автор: cthutq 4.4.2007, 16:12
Цитата(JackYF @  4.4.2007,  16:02 Найти цитируемый пост)
boost::thread уже сам по себе неплохой класс. Что ты хочешь еще привнести туда, в плане функциональности, делая свой собственный класс?

1. Хочу избавиться от постоянного написания одного и того же кода (например запуск и остановка потока, которые однотипны для каждого класса). Для этого класс Thread
2. Хочу механизм оповещения о завершении тоже написать один раз и просто наследоваться от него и перекрывать виртуальные методы. Для этого класс IThread
3. Ну и хотелось бы решить вопрос с запуском потока.

Автор: JackYF 4.4.2007, 16:21
что ж, ясно. Не совсем уверен, что архитектура правильная, но сейчас не предложу более хорошей smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)