Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> базовый класс поток 
:(
    Опции темы
cthutq
Дата 3.4.2007, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 16.4.2006

Репутация: нет
Всего: нет



борюсь тут с потоками и получилось примерно следующее
Код

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

Может кто знает как правильно ?
PM MAIL   Вверх
JackYF
Дата 4.4.2007, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



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


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



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
cthutq
Дата 4.4.2007, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 16.4.2006

Репутация: нет
Всего: нет



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

1. Хочу избавиться от постоянного написания одного и того же кода (например запуск и остановка потока, которые однотипны для каждого класса). Для этого класс Thread
2. Хочу механизм оповещения о завершении тоже написать один раз и просто наследоваться от него и перекрывать виртуальные методы. Для этого класс IThread
3. Ну и хотелось бы решить вопрос с запуском потока.
PM MAIL   Вверх
JackYF
Дата 4.4.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



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



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0726 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.