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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запуск метода в отдельном потоке 
:(
    Опции темы
batex
Дата 6.8.2012, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день. Есть класс MainClass. Необходимо из одного метода этого класса запустить другой в другом потоке. Метод нельзя делать статиком. Необходимо оставить все вкусности ООП.
Т.е.

Код

class MainClass{
typedef MainClass this_t;
//тут много всяких методов.
static void Method1(this_t* this1, int stat, size_t writ)
{
bool success = (stat == 0 && writ != 0);
this->Method2(success);//вот этот метод отсюда необходимо запустить в другом потоке.
}
void Method2(bool success)
{
тут что-то долго происходит...
}
//еще много всякого


Гугл пока что не очень помог. Есть какие нибудь идеи?
PM MAIL   Вверх
saneea
Дата 6.8.2012, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ну на чистом C++ никак такое не сделать. Нужно использовать WinAPI (ну или Qt, boost как обёртки).
PM MAIL   Вверх
boostcoder
Дата 6.8.2012, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



так:
Код

#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <boost/noncopyable.hpp>
#include <boost/shared_ptr.hpp>

namespace ba = boost::asio;

template<typename T>
struct threaded_object: boost::noncopyable {
   threaded_object()
   :_ios(),
   _work(new ba::io_service::work(_ios)),
   _thread(boost::bind(&ba::io_service::run, &_ios)),
   _obj()
   {}
   
   ~threaded_object() {
      _work.reset();
      _thread.join();
   }

   template<typename... Args>
   void operator()(void(T::*m)(Args...), Args... args) {
      _ios.post(boost::bind(m, &_obj, boost::cref(args)...));
   }
   
private:
   ba::io_service _ios;
   boost::shared_ptr<ba::io_service::work> _work;
   boost::thread _thread;
   T _obj;
};

struct test {
   void m1() {
      std::cout
      << "this thread id = " << boost::this_thread::get_id() << " -> "
      << __PRETTY_FUNCTION__ << std::endl;
   }
   void m2(int v) {
      std::cout
      << "this thread id = " << boost::this_thread::get_id() << " -> "
      << __PRETTY_FUNCTION__ << ": v = " << v << std::endl;
   }
   void m3(int v, const char* s) {
      std::cout
      << "this thread id = " << boost::this_thread::get_id() << " -> "
      << __PRETTY_FUNCTION__ << ": v = " << v << ", s = " << s << std::endl;
   }
};

int main() {

   std::cout << "main thread id = " << boost::this_thread::get_id() << std::endl;
   threaded_object<test> t;
   t(&test::m1);
   t(&test::m2, 33);
   t(&test::m3, 44, "55");
}


Добавлено @ 13:39
Цитата(saneea @  6.8.2012,  13:31 Найти цитируемый пост)
на чистом C++ никак такое не сделать.

легко.
std::list+std::thread+std::bind

Это сообщение отредактировал(а) boostcoder - 6.8.2012, 15:12
PM WWW   Вверх
EnergoHokum
Дата 6.8.2012, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

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



PM MAIL ICQ   Вверх
saneea
Дата 6.8.2012, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

легко.
std::list+std::thread+std::bind

спасибо, буду знать, что новый стандарт C++ знает, что такое потоки!  smile 
PM MAIL   Вверх
borisbn
Дата 7.8.2012, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(boostcoder @  6.8.2012,  13:38 Найти цитируемый пост)
std::list+std::thread+std::bind

не очень понял, зачем в данном случае нужен list  smile 
Вот самое простое, что можно сделать для задачи ТС

Код

class MainClass {
public:
    MainClass() : m_thread( 0 ) {}
    ~MainClass() {
        if ( m_thread ) {
           m_thread->join();
        }
    }
//тут много всяких методов.
   void Method1( int stat, size_t writ )
   {
      bool success = (stat == 0 && writ != 0);
      m_thread = new std::thread( & MainClass::Method2, this, success ); //вот этот метод отсюда необходимо запустить в другом потоке.
   }
private:
   std::thread * m_thread;
   void Method2( bool success )
   {
      //тут что-то долго происходит...
      cout << this << " " << __PRETTY_FUNCTION__ << " = " << success << endl;
   }
//еще много всякого
};

int main()
{
   MainClass a;
   MainClass b;
   a.Method1( 0, 42 );
   b.Method1( 1, 42 );
}

http://liveworkspace.org/code/8bdc1ded8c79...a0694e20a8375b7

Кста, тут и bind не потребовался


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 7.8.2012, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(borisbn @  7.8.2012,  09:27 Найти цитируемый пост)
зачем в данном случае нужен list

а есть гарантия что выполнение предыдущего метода завершится раньше чем ты решишь выполнить еще один?

PM WWW   Вверх
baldina
Дата 7.8.2012, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



Цитата(boostcoder @  7.8.2012,  09:50 Найти цитируемый пост)
а есть гарантия что выполнение предыдущего метода завершится раньше чем ты решишь выполнить еще один?

почему бы им не работать параллельно? последовательным должен быть доступ к членам класса, для этого есть блокировки, но семантику метода определяет разработчик. (хотя по мне лучше вместо обеспечения реентерабельности использовать разные объекты, а синхронизацию возложить на специальный объект. так проще и понятней. но это значит - никаких параллельных запусков функции-члена из самого объекта)
PM MAIL   Вверх
boostcoder
Дата 7.8.2012, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(baldina @  7.8.2012,  10:28 Найти цитируемый пост)
почему бы им не работать параллельно?

в каком кол-ве?
почему именно в таком?
чем ограничивается?
интеллектуальный пул?

есть ли вообще в этом смысл?

PM WWW   Вверх
baldina
Дата 7.8.2012, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



Цитата(boostcoder @  7.8.2012,  10:41 Найти цитируемый пост)
в каком кол-ве?
почему именно в таком?
чем ограничивается?
интеллектуальный пул?

есть ли вообще в этом смысл?

это вопросы к разработчику класса  smile 

хотя абстрактную сферическую задачу сформулировать могу, например - рассылка спама. упомянутая функция берет из базы адрес, куда еще не было рассылки, шлет письмо и обновляет базу. цель - разослать письма всем адресатам из базы. допустим в данных класса только информация о соединении к базе и сам запрос, значит данные класса не модифицируются, так что даже блокировок не надо (это задача базы). вот эту функцию и можно параллелить

Добавлено через 46 секунд
повторюсь, это не мой метод, просто модель ответа на конкретный вопрос))))
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1265 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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