Выполнить функцию в C ++ после асинхронной 60-секундной задержки? - PullRequest
0 голосов
/ 15 мая 2018

Я читал, что это можно сделать с помощью std :: this_thread :: sleep_for и std :: async , но это не работает для меня.

Вот вызываемая функция:

bool Log::refresh_data()
{   

    std::this_thread::sleep_for( std::chrono::minutes( 1 ) );

    std::vector<std::string> file_info = this->file.read_pending_if();

    for( auto line : file_info )
    {
        this->append( line );
    }

    return true;
}

, которая вызывается из другой функции.В приведенном ниже коде есть два примера неудачного использования:

void MVC::refresh_data()
{
    // Error C3867  'Log::refresh_data': non-standard syntax; use '&' to create a pointer to member
    std::future<bool> retCode = std::async( this->model_log.refresh_data, 0 );        
    std::future<bool> retCode = std::async( this->model_log.refresh_data(), 0 );
}

Первоначально bool Log :: refresh_data () был void Log :: refresh_data () но std :: async не похоже на возврат по пустоте ...

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Вы не можете передать нестатический метод, подобный этому, в C ++, вы можете сделать:

auto retCode = std::async(&Log::refresh_data, model_log);
// Or with a lambda:
auto retCode = std::async([this]() { 
    return model_log.refresh_data(); 
});

Эти коды работают с типом возврата void (вам просто нужно удалить оператор return в лямбда-выражении).

0 голосов
/ 15 мая 2018

Поскольку refresh_data - это метод Log, вам нужно использовать std::bind с model_log или использовать лямбду:

std::future<bool> retCode = std::async( [this] {return model_log.refresh_data(); }); 
...