C++ boost-deadline\u定时器编译问题

C++ boost-deadline\u定时器编译问题,c++,boost,deadline-timer,C++,Boost,Deadline Timer,以下源代码将不会使用MSVC 12编译 IMCThreadMngr.cpp #include "IMCThreadMngr.h" CIMCThreadMngr::CIMCThreadMngr() : mService(), mWork(mService) {} CIMCThreadMngr::~CIMCThreadMngr() {}; void CIMCThreadMngr::StopManager() { std::cout << "Manager ceasing

以下源代码将不会使用MSVC 12编译

IMCThreadMngr.cpp

#include "IMCThreadMngr.h"


CIMCThreadMngr::CIMCThreadMngr() : mService(),
mWork(mService)
{}

CIMCThreadMngr::~CIMCThreadMngr() {};


void CIMCThreadMngr::StopManager()
{
    std::cout << "Manager ceasing" << std::endl;
    mService.stop();
    mServicethread.join();
    std::cout << "Manager ceased" << std::endl;
}

void CIMCThreadMngr::StartManager()
{
    mServicethread = boost::thread(boost::bind(&boost::asio::io_service::run, &mService));
}

void CIMCThreadMngr::RegisterThread(const std::string& name, int timeout)
{
    if (name.length() == 0) {
        std::cout << "No thread name provided" << std::endl;
        return;
    }
    boost::mutex::scoped_lock lock(mGroupMutex);

    ThreadObject ob = ThreadObject(mService);   
    ob.name_ = name;
    if (timeout > 0) {
    ob.timeout_ = timeout;
    }
    else {
    ob.timeout_ = 2000;
    }
    mThreadGroup.push_back(ob);

}

void CIMCThreadMngr::UnRegisterThread(const std::string& name)
{
    if (name.length() == 0) {
        std::cout << "No thread name provided" << std::endl;
        return;
    }

    boost::mutex::scoped_lock lock(mGroupMutex);

    std::vector<ThreadObject>::iterator obref;
    if (FindThreadObject(name, obref)){
        mThreadGroup.erase(obref);
    }
}

void CIMCThreadMngr::ThreadCheckIn(const std::string& name){

    if (name.length() == 0) {
        std::cout << "No thread name provided" << std::endl;
        return;
    }

    boost::mutex::scoped_lock lock(mGroupMutex);

    std::vector<ThreadObject>::iterator obref;  
    if (FindThreadObject(name, obref)){
        obref->timer_.cancel();
        obref->timer_.expires_from_now(boost::posix_time::seconds(obref->timeout_));
        obref->timer_.async_wait(boost::bind(&CIMCThreadMngr::TimeoutElapsed, this));
    }
}

bool CIMCThreadMngr::FindThreadObject(const std::string name, std::vector<ThreadObject>::iterator& ob){

    for (ob = mThreadGroup.begin(); ob != mThreadGroup.end(); ob++) {
        if ((ob->name_.compare(name) == 0)) {
            return true;
        }
    }
    return false;
}

void CIMCThreadMngr::TimeoutElapsed(const boost::system::error_code& e, const std::string& name){

    boost::mutex::scoped_lock lock(mGroupMutex);

    if (e != boost::asio::error::operation_aborted)
    {
        std::cout << "Thread " << name << " did has not responded" << std::endl; // Timer was not cancelled, take necessary action.
        ThreadCheckIn(name);
    }
}
#包括“IMCThreadMngr.h”
CIMCThreadMngr::CIMCThreadMngr():mService(),
mWork(mService)
{}
CIMCThreadMngr::~CIMCThreadMngr(){};
void CIMCThreadMngr::StopManager()
{

std::cout
boost::asio::deadline\u timer
既不可复制也不可移动(既不可复制也不可移动)。因此,
CIMCThreadMgr::ThreadObject
也不可移动,这意味着您不能拥有
std::vector

解决此问题的一个简单方法是将
截止时间计时器保持在
共享\u ptr
中,如中所示

struct ThreadObject {
    std::string name_;
    int timeout_;
    bool threadrunning_;
    boost::posix_time::ptime lastupdate_;

    // HERE
    std::shared_ptr<boost::asio::deadline_timer> timer_;

    ThreadObject(boost::asio::io_service& service)
      // Also HERE
      : timer_(std::make_shared<boost::asio::deadline_timer>(service))
    {
        // -> instead of . now.
        timer_->expires_from_now(boost::posix_time::millisec(3000));
    }
};

可能可以使用
std::unique\u ptr
,但这可能需要对代码进行更大的更改,而不是在少数地方将
替换为
->
(因为
ThreadObject
只能移动,不能复制)。

Hmmm这是一个愚蠢的疏忽!!感谢您的快速响应!
f:\boost\boost_1_57_0\boost\asio\basic_deadline_timer.hpp(510): error C2248: 'boost::asio::basic_io_object<TimerService,false>::operator =' : cannot access private member declared in class 'boost::asio::basic_io_object<TimerService,false>'
          with
          [
              TimerService=boost::asio::deadline_timer_service<boost::posix_time::ptime,boost::asio::time_traits<boost::posix_time::ptime>>
          ]
          f:\boost\boost_1_57_0\boost\asio\basic_io_object.hpp(164) : see declaration of 'boost::asio::basic_io_object<TimerService,false>::operator ='
          with
          [
              TimerService=boost::asio::deadline_timer_service<boost::posix_time::ptime,boost::asio::time_traits<boost::posix_time::ptime>>
          ]
          This diagnostic occurred in the compiler generated function 'boost::asio::basic_deadline_timer<boost::posix_time::ptime,boost::asio::time_traits<boost::posix_time::ptime>,boost::asio::deadline_timer_service<Time,TimeTraits>> &boost::asio::basic_deadline_timer<Time,TimeTraits,boost::asio::deadline_timer_service<Time,TimeTraits>>::operator =(const boost::asio::basic_deadline_timer<Time,TimeTraits,boost::asio::deadline_timer_service<Time,TimeTraits>> &)'
          with
         [
             Time=boost::posix_time::ptime,            TimeTraits=boost::asio::time_traits<boost::posix_time::ptime>
         ]
struct ThreadObject {
    std::string name_;
    int timeout_;
    bool threadrunning_;
    boost::posix_time::ptime lastupdate_;

    // HERE
    std::shared_ptr<boost::asio::deadline_timer> timer_;

    ThreadObject(boost::asio::io_service& service)
      // Also HERE
      : timer_(std::make_shared<boost::asio::deadline_timer>(service))
    {
        // -> instead of . now.
        timer_->expires_from_now(boost::posix_time::millisec(3000));
    }
};
if (FindThreadObject(name, obref)){
    //           vv-- HERE
    obref->timer_->cancel();
    obref->timer_->expires_from_now(boost::posix_time::seconds(obref->timeout_));
    obref->timer_->async_wait(boost::bind(&CIMCThreadMngr::TimeoutElapsed, this));
}