crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Многопоточное приложение, сервер... boost::thread + boost::asio
Lestat
  опции профиля:
сообщение 7.7.2008, 14:43
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 11.6.2008
Из: Москва
Пользователь №: 198

Спасибо сказали: 0 раз(а)




Репутация:   0  


Необходимо организовать довольно простой сервер на небольшое количество клиентов (около 10-20).
Решил сделать по потоку на клиента. Возникают вопросы...
Пишу класс в котором должен работать поток... сколько клиентов, столько и экземпляров этого класса в массиве, например, держать можно

Цитата
#pragma once
#include "include.hpp"

class ClientThread
{
public:
ClientThread(void);
~ClientThread(void);
private:
void Thread(void);
boost::thread *thrd;
};

Цитата
#include "ClientThread.h"

ClientThread::ClientThread(void)
{
thrd = new boost::thread(&Thread);
}
void ClientThread::Thread(void)
{
while(true) std::cout << "Я работаю..." << std::endl;
}
ClientThread::~ClientThread(void) { }


при компиляции вываливается error C2276: '&' : illegal operation on bound member function expression

Насколько понимаю проблема в том, что буст не знает адрес процедуры Thread
в строке thrd = new boost::thread(&Thread);

Не врубаюсь как обойти этот момент, помогите плз.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 7.7.2008, 15:12
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


у тебя в include.hpp есть
#include <boost/thread/thread.hpp>
???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Lestat
  опции профиля:
сообщение 7.7.2008, 15:13
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 11.6.2008
Из: Москва
Пользователь №: 198

Спасибо сказали: 0 раз(а)




Репутация:   0  


Простите, наткнулся на полезный ИСХОДНИК

вобщем теперь класс выглядит так и все работает:

Цитата
#pragma once
#include "include.hpp"

class ClientThread
{
public:
ClientThread(void);
~ClientThread(void);

private:
void Thread(void);
boost::shared_ptr<boost::thread> m_thread;
};

Цитата
#include "ClientThread.h"
#include <boost/bind.hpp>

ClientThread::ClientThread(void)
{
m_thread = boost::shared_ptr<boost::thread>(new boost::thread(boost::bind(&ClientThread::Thread, this)));
}

void ClientThread::Thread(void)
{
while(true) std::cout << "Я работаю..." << std::endl;
}

ClientThread::~ClientThread(void)
{

}


Тему можно удалить, ну или оставить в образовательных целях... возможно кому-то поможет

ДА, ViGOur... в инклудах должно быть
#include <boost/thread.hpp>
#include <boost/bind.hpp>

Сообщение отредактировал Lestat - 7.7.2008, 15:15
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrew Selivanov
  опции профиля:
сообщение 9.7.2008, 10:21
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Lestat, посмотри на примеры из Boost.Thread (%BOOST_HOME%\libs\thread\example\)
В частности на пример с голодными философами(starvephil.cpp) :)
Там есть класс адаптер для такого рода случаев:

class thread_adapter
{
public:
    thread_adapter(void (*func)(void*), void* param)
        : _func(func), _param(param)
    {
    }
    void operator()() const { _func(_param); }
private:
    void (*_func)(void*);
    void* _param;
};


Предназначен для привязки потока к конкретному объекту:
boost::thread thrd_phil0(thread_adapter(&phil::do_thread, &p[0]));


Сообщение отредактировал Andrew Selivanov - 9.7.2008, 10:23
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Lestat
  опции профиля:
сообщение 10.7.2008, 22:21
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 11.6.2008
Из: Москва
Пользователь №: 198

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо, Andrew Selivanov, пока трогать боюсь то, что работает, но позже разберусь и подправлю...

Дошел до работы с сетью. Вобщем в клиентском приложении получаю данные... читает, но все виснет... очень сильно нагружает систему

Читаю вот так:
Цитата
try
{
boost::signal1<void, std::string> getMessageSignal;
getMessageSignal.connect(&getData);

boost::asio::ip::tcp::iostream stream(host_name, "daytime");

for (;;)
{
std::string data;
std::getline(stream, data);
if(data.length() > 0) getMessageSignal(data);
}
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}

Я так думаю что виснет в результе того, что std::getline(stream, data); не ждет пока в сокете будет строка, а просто именно читает...
как обойти этот момент? можно ли его заставить именно ждать?
Спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrew Selivanov
  опции профиля:
сообщение 11.7.2008, 9:14
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


А какого поведения ты от нее ждешь? :)
std::getline вытаскивает строку из потока а потом - вечный цикл очень сильно загружает систему (или очередной getline) :-D
В данном случае лучше посмотри на работу с асинхронными функциями:
      // Read the response status line.
      boost::asio::async_read_until(socket_, response_, "\r\n",
          boost::bind(&client::handle_read_status_line, this,
            boost::asio::placeholders::error));
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 1:20