crossplatform.ru

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


  Ответ в Многопоточное приложение
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Andrew Selivanov Дата 11.7.2008, 9:14
  А какого поведения ты от нее ждешь? :)
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));
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) :)
Там есть класс адаптер для такого рода случаев:

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]));
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 есть
#include <boost/thread/thread.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);

Не врубаюсь как обойти этот момент, помогите плз.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 27.4.2024, 21:33