Я добрая для 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;
}
Приносим извинения за путаницу, связанную с post_job vs post_file_job. Но ваше предположение верно, post_file_job - это просто опечатка. И я хотел назвать post_job. – hebbo
Спасибо за усилия. Я очень ценю это. Обычно я не отправляю код, который можно скомпилировать, потому что я не хочу, чтобы люди выполняли мою работу за меня. Я хочу сделать это сам. Я просто прошу людей пересмотреть код (самые важные его части) и вести меня по правильному пути. Я хочу сделать свою работу. – hebbo
«потому что я не хочу, чтобы люди делали мою работу для меня» - это странный мотив. Обеспечение правильности и полноты ** предотвращает ** людей, теряющих время на несуществующие или невозможные проблемы. ** Не ** делать это граничит с невежливым. – sehe