std :: bind无法调用类成员函数:C ++

时间:2015-03-31 11:05:05

标签: c++11 boost

我必须实施A valve Open function (for specified duration)。 我正在使用boost::asio::deadline_timer

打开阀门的我的班级成员功能是:

bool Valves::valveOpen(ValveType type)
    {
        switch (type)
        {
        case eVentValve:
            tblMap_.digitalInput[eVentValveK1].setBit();
            if (tblMap_.digitalOutput[eOutK1VentValve].getBit())
            {
                isVentOpen_ = true;
            }
            return isVentOpen_;

        case eVacuumPumpValve:

....
....
}

关闭阀门的类成员函数是:

bool Valves::valveClose(ValveType type)
{
    switch (type)
    {
    case eVentValve:
        tblMap_.digitalInput[eVentValveK1].clearBit();
        if (!tblMap_.digitalOutput[eOutK1VentValve].getBit())
        {
            isVentOpen_ = false;
        }
        return !isVentOpen_;

    case eVacuumPumpValve:
....
....
}

我正在尝试按以下方式实现计时器操作

bool Valves::valveTimedOpen(ValveType type, int sec)
{
    boost::asio::io_service io;
    switch (type)
    {
    case eVentValve:
    {
                    std::bind(&Valves::valveOpen, this, type); //Here
                    boost::asio::deadline_timer t(io, boost::posix_time::seconds(sec));
                    t.async_wait(std::bind(&Valves::valveClose, this, type));
                    boost::thread th(boost::bind(&boost::asio::io_service::run, &io));
                    return true;
    }

    case eVacuumPumpValve:

.....
.....
}

代码命中Here行,即

std::bind(&Valves::valveOpen, this, type);但它没有转到bool Valves::valveOpen(ValveType type)函数。

有人可以通过此代码告诉我这个问题吗?

2 个答案:

答案 0 :(得分:3)

变量iotvalveTimedOpen退出后立即超出范围。您需要重新考虑与boost asio组件交互的方式,例如io_service可以是您的类的成员,并且可以动态分配计时器,并且需要在完成处理程序中删除它。

此外,请注意,如果您打算重新使用io_service对象,则还需要先reset再次调用run

答案 1 :(得分:0)

      auto fn = std::bind(&Test::Open, shared_from_this(), std::placeholders::_1);
      fn(type);

正确调用Open()

io_serviceboost::deadline_timer我必须按照@Ralf的建议成为小组成员

工作代码:

#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/thread.hpp>
#include <boost/asio.hpp>


class Test : public std::enable_shared_from_this <Test>
{
public:
    Test() :io(), timer(io){}
    void Open(int num);
    void Close(int num);
    void TimedOpen(int num, int dur);
    void Run();
private:
    boost::asio::io_service io;
    boost::asio::deadline_timer timer;
};

void Test::Open(int num)
{
    std::cout << "Open for Number : " << num << std::endl;
}

void Test::Close(int num)
{
    std::cout << "Close for Number : " << num << std::endl;
}

void Test::TimedOpen(int num, int dur)
{
    io.reset();
    auto fn = std::bind(&Test::Open, shared_from_this(), std::placeholders::_1);
    fn(num);
    timer.expires_from_now( boost::posix_time::seconds(dur));
    timer.async_wait(std::bind(&Test::Close, shared_from_this(), num));
    Run();
    std::cout << "Function Exiting" << std::endl;
}

void Test::Run()
{
    boost::thread th(boost::bind(&boost::asio::io_service::run, &io));
}

int main()
{
    auto t = std::make_shared<Test>();
    t->TimedOpen(5, 5);
    char line[128];
    while (std::cin.getline(line, 128))
    {
        if (strcmp(line, "\n")) break;
    }
    return 0;
}