Многопоточное приложение, сервер... boost::thread + boost::asio |
Здравствуйте, гость ( Вход | Регистрация )
Многопоточное приложение, сервер... 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 есть
???
|
|
|
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) Там есть класс адаптер для такого рода случаев:
Предназначен для привязки потока к конкретному объекту:
Сообщение отредактировал 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 В данном случае лучше посмотри на работу с асинхронными функциями:
|
|
|
Текстовая версия | Сейчас: 29.3.2024, 1:20 |