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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обертка над std::thread, хранение параметров 
:(
    Опции темы
Tiarwe
Дата 29.1.2014, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Приветствую!
Пишу обертку над потоками.
Код

class Thread
{
    std::thread* mThread;

public:
    template<class _Fn, class... _Args>
    void Initiate(_Fn&& _Fx, _Args&&... _Ax)
    {
        mThread = new std::thread(_Fx, _Ax...);
    }
};


Сейчас при создании потока происходит его запуск. Хочу перенести это в функцию Start(), в таком случае нужно хранить принимаемые аргументы _Fn и _Args. Как это записать и можно ли вообще?
PM MAIL   Вверх
mabrarov
Дата 29.1.2014, 17:35 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Tiarwe @ 29.1.2014,  17:06)
Сейчас при создании потока происходит его запуск. Хочу перенести это в функцию Start(), в таком случае нужно хранить принимаемые аргументы _Fn и _Args. Как это записать и можно ли вообще?

Добрый вечер.
Неясно, зачем вам это нужно. Если очень (!) нужно, то делайте так, как это делает std::bind/std::function (или используйте их в своей обертке) - в зависимости от того, хотите ли вы чтобы ваш класс Thread был шаблонным (std::bind) или не был шаблонным (std::function).
А вообще можно же явно использовать эти 2 прекрасные возможности C++11 (Boost C++ Libraries) в комбинации с std::thread:
Код
// Заранее создаем функтор для запуска потока. Данный фукнтор будет хранить и наши параметры
auto thread_func1 = std::bind(my_func, my_param1, my_param2);
// или
std::function<void (void)> thread_func2 = std::bind(my_func, my_param1, my_param2);
// ...
// Когда нужно запустить поток
std::thread my_thread1(thread_func1);
std::thread my_thread2(thread_func2);


Можно, конечно, написать и так (здравствуй, type erasure и C++11):
Код
class Thread
{
    std::unique_ptr<std::thread> mThread;
    std::function<void (void)> mThreadFunction;

public:
    Thread()
    {
    }

    template<typename _Fn, typename... _Args>
    explicit Thread(_Fn&& _Fx, _Args&&... _Ax)
        : mThreadFunction(std::bind(std::forward<_Fx>(_Fx), std::forward<_Args>(_Ax)...))
    {
    }

    template<typename _Fn, typename... _Args>
    void Initiate(_Fn&& _Fx, _Args&&... _Ax)
    {
        mThreadFunction = std::bind(std::forward<_Fx>(_Fx), std::forward<_Args>(_Ax)...);
    }

    void Start()
    {
        assert(!mThread);
        assert(mThreadFunction);
        mThread = new std::thread(mThreadFunction);
    }

    void Join()
    {
        assert(mThread);
        mThread->join();
        mThread = nullptr;
    }
};


Это сообщение отредактировал(а) mabrarov - 29.1.2014, 17:43
PM MAIL WWW Skype   Вверх
Tiarwe
Дата 30.1.2014, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



mabrarov,  большое спасибо)
PM MAIL   Вверх
akizelokro
Дата 31.1.2014, 01:36 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Ну, потоки в С++ туповастеньки и малость эффекитвны. Писать wrapper над толпой долпоиопв вещь рискованная, на многорискованная.

Добавлено через 7 минут и 2 секунды
Вообще-то, это уже уход в сторону variadic templates и если тебе охота в cnjhjye va_start.
вопрос зачем тебе это надо, козырнуть передаваемой в thread капеллой переменных, или накрыжить всю эту хню


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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