Здравствуйте, гость ( Вход | Регистрация )
Andrew Selivanov | Дата 11.7.2008, 9:14 |
А какого поведения ты от нее ждешь? std::getline вытаскивает строку из потока а потом - вечный цикл очень сильно загружает систему (или очередной getline) :-D В данном случае лучше посмотри на работу с асинхронными функциями:
|
|
Lestat | Дата 10.7.2008, 22:21 |
Спасибо, 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 | Дата 9.7.2008, 10:21 |
Lestat, посмотри на примеры из Boost.Thread (%BOOST_HOME%\libs\thread\example\) В частности на пример с голодными философами(starvephil.cpp) Там есть класс адаптер для такого рода случаев:
Предназначен для привязки потока к конкретному объекту:
|
|
Lestat | Дата 7.7.2008, 15:13 |
Простите, наткнулся на полезный ИСХОДНИК вобщем теперь класс выглядит так и все работает: Цитата #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> |
|
ViGOur | Дата 7.7.2008, 15:12 |
у тебя в include.hpp есть ??? |
|
Lestat | Дата 7.7.2008, 14:43 |
Необходимо организовать довольно простой сервер на небольшое количество клиентов (около 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); Не врубаюсь как обойти этот момент, помогите плз. |
|
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 28.4.2024, 19:26 |