2015-08-28 4 views
1

Я добрая для Boost.boost: bind и io_service в двух разных классах

Я хотел бы знать, как построить io_service в одном классе и отправить задания из другого класса.

Моя проблема BOOST_ASIO_COMPLETION_HANDLER_CHECK жалуется и не позволяет компилировать код.

Он скелет моего кода:

type_defs.h (это имеет функцию, которая должна оборачиваться и отправлена ​​в io_service)

#include "boost/filesystem.hpp" 

namespace fs = ::boost::filesystem; 

typedef boost::function<void(const fs::path path)> parse_and_aggregate_fun_t; 

io_service_processors.h (это класс, который будет постройте io_service и дождитесь сообщений о вакансиях).

namespace asio = boost::asio; 

typedef std::unique_ptr<asio::io_service::work> work_ptr; 

class io_service_processors { 
public: 
    io_service_processors(int tc); 
    virtual ~io_service_processors(); 

    void init(); 
    void post_job(parse_and_aggregate_fun_t file_job); 

private: 
    int thread_count; 
    asio::io_service* service; 
    boost::mutex mtx; 
    work_ptr * work; 
    boost::thread_group workers; 
}; 

io_service_processors.cpp

namespace asio = boost::asio; 

io_service_processors::io_service_processors(int tc):thread_count(tc) { 

} 

io_service_processors::~io_service_processors() { 
     // clean up code here removed. 
} 

void io_service_processors::init() { 
    this->service = new asio::io_service(); 
    this->work = new work_ptr(new asio::io_service::work(*(this->service))); 
    for(int i = 0; i < this->thread_count; ++i) 
     this->workers.create_thread(boost::bind(&asio::io_service::run, this->service)); 
} 

void io_service_processors::post_job(parse_and_aggregate_fun_t file_job) { 
    this->service->post(file_job); 
} 

job_discoverer.cpp (это один обнаружим файлы и передавать их пути к к io_service, функция parse_and_aggregate будет фактическая работа для открытия файла и его обработки, process просто разместит завернутую функцию в io_service, this->processor - это просто указатель на класс оболочки io_service выше).

void job_discoverer::process(const fs::path path){ 
    std::cout << "Posting file: " << path.string() << std::endl; 
    if(this->processor) 
     this->processor->post_job(
       boost::bind(&job_discoverer::parse_and_aggregate, this, path) 
       ); 
} 

void job_discoverer::parse_and_aggregate(const fs::path path) { 
    std::cout << "Parsing and aggregating file: " << path.string() << std::endl; 
} 

ответ

1
this->service->post(file_job); 

пытается опубликовать работу, но это не нульарной функция. Конечно, это не сработает. Вы имели в виду привязать значение к параметру path?

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

typedef boost::function<void()> any_job; 

Live On Coliru

#include <boost/filesystem.hpp> 
#include <boost/bind.hpp> 
#include <boost/thread.hpp> 
#include <boost/function.hpp> 

namespace fs = ::boost::filesystem; 

typedef boost::function<void()> any_job; 

#include <boost/asio.hpp> 
namespace asio = boost::asio; 

typedef std::unique_ptr<asio::io_service::work> work_ptr; 

class io_service_processors { 
public: 
    io_service_processors(int tc); 
    virtual ~io_service_processors(); 

    void init(); 
    void post_job(any_job file_job); 

private: 
    int thread_count; 
    asio::io_service* service; 
    boost::mutex mtx; 
    work_ptr * work; 
    boost::thread_group workers; 
}; 

io_service_processors::io_service_processors(int tc):thread_count(tc) { 

} 

io_service_processors::~io_service_processors() { 
     // clean up code here removed. 
} 

void io_service_processors::init() { 
    this->service = new asio::io_service(); 
    this->work = new work_ptr(new asio::io_service::work(*(this->service))); 
    for(int i = 0; i < this->thread_count; ++i) 
     this->workers.create_thread(boost::bind(&asio::io_service::run, this->service)); 
} 

void io_service_processors::post_job(any_job file_job) { 
    std::cout << __PRETTY_FUNCTION__ << "\n"; 
    this->service->post(file_job); 
} 

struct job_discoverer { 

    boost::optional<io_service_processors> processor; 

    void process(const fs::path path){ 
     std::cout << "Posting file: " << path.string() << std::endl; 
     if(this->processor) 
      this->processor->post_job(
        boost::bind(&job_discoverer::parse_and_aggregate, this, path) 
        ); 
    } 

    void parse_and_aggregate(const fs::path path) { 
     std::cout << "Parsing and aggregating file: " << path.string() << std::endl; 
    } 
}; 

int main() { 
} 
+0

Приносим извинения за путаницу, связанную с post_job vs post_file_job. Но ваше предположение верно, post_file_job - это просто опечатка. И я хотел назвать post_job. – hebbo

+0

Спасибо за усилия. Я очень ценю это. Обычно я не отправляю код, который можно скомпилировать, потому что я не хочу, чтобы люди выполняли мою работу за меня. Я хочу сделать это сам. Я просто прошу людей пересмотреть код (самые важные его части) и вести меня по правильному пути. Я хочу сделать свою работу. – hebbo

+0

«потому что я не хочу, чтобы люди делали мою работу для меня» - это странный мотив. Обеспечение правильности и полноты ** предотвращает ** людей, теряющих время на несуществующие или невозможные проблемы. ** Не ** делать это граничит с невежливым. – sehe

1

В io_service_processors::post_job вы положили parse_and_aggregate_fun_t в io_service::post. Функциональная подпись для handler в io_service::postmust be void(). Твое void(const fs::path)

+0

Это только половина истории, хотя – sehe

+0

@sehe Конечно, но это достаточно истории, остальное просто предположения, как он Ждут» t сообщение MVCE. Вы следовали за остальными за «юморное сакэ», но у меня, похоже, не было достаточного количества юмора.^Его вызов «io_service :: post» - явная ошибка, остальное - только фоновый шум, который может или не может существовать, как только он исправлены все последующие ошибки – Slyps

+0

Напротив. Его вызов сообщения только кажется ошибочным, потому что он получил тип 'parse_and_aggregate_fun_t' неправильный. Вызов, возможно, правильный. И да, я отметил OP, что он должен был сделать более осторожный SSCCE – sehe

Смежные вопросы