2017-03-20 15 views
1

を何をやっている私は、定期的なタイマーを作成するため、次の質問の最初の答えからコードを適応している: How do I make the boost/asio library repeat a timer?使用方法::バインド...私が間違っ

私は方法として「カウント」変数を削除私は繰り返し実行したいが、計算のためのパラメータを取らない。

コンパイラは次のエラーで失敗します。私は間違って何をやっている

Error C2825 'F': must be a class or namespace when followed by '::' C:\.conan\wkypad\1\include\boost\bind\bind.hpp 75 
Error C2510 'F': left of '::' must be a class/struct/union C:\.conan\wkypad\1\include\boost\bind\bind.hpp 75 
Error C3646 'type': unknown override specifier C:\.conan\wkypad\1\include\boost\bind\bind.hpp 75 
Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int C:\.conan\wkypad\1\include\boost\bind\bind.hpp 75 
Error C2039 'type': is not a member of 'boost::_bi::result_traits<R,F>' C:\.conan\wkypad\1\include\boost\bind\bind.hpp 1284  

? 私はboost :: bindの使い方が間違っていると思いますが、正確な理由を理解することはできません。あなたはメンバ関数をバインドする場合

timer.async_wait(boost::bind(&ProjectBrowserComponent::fetchData, this, boost::asio::placeholders::error, &timer)); 

、あなたがオブジェクトの正しいインスタンスにも、それらをバインドする必要があります。ここでは

は私のコード

これについてどのように
class ProjectBrowserComponent ... 

private: 
    void fetchData(const boost::system::error_code& /*e*/, 
     boost::asio::deadline_timer* t); 
    std::vector<Project> projects; 
    ProjectsController pc; 
    std::future<std::vector<Project>> projectsFuture; 
    int interval_secs = 1; 

... 

template<typename R> 
bool isReady(std::future<R> const& f) 
{ 
    Logger::writeToLog("check future"); 
    return f.wait_for(std::chrono::seconds(-1)) == std::future_status::ready; 
} 

void ProjectBrowserComponent::initData() { 
    Logger::writeToLog("requesting projects"); 
    projectsFuture = std::async(std::launch::async, &ProjectsController::getProjects, &pc); 
    Logger::writeToLog("requested projects"); 
    boost::asio::io_service io_service; 
    boost::asio::deadline_timer timer(io_service, boost::posix_time::seconds(interval_secs)); 
    timer.async_wait(boost::bind(&ProjectBrowserComponent::fetchData, boost::asio::placeholders::error, &timer)); 
    io_service.run(); 
} 

void ProjectBrowserComponent::fetchData(const boost::system::error_code& /*e*/, 
    boost::asio::deadline_timer* timer) { 
    if (isReady(projectsFuture)) { 
     projects = projectsFuture.get(); 
     std::cout << "got projs"; 
    } 
    else { 
     timer->expires_at(timer->expires_at() + boost::posix_time::seconds(interval_secs)); 
     // Posts the event 
     timer->async_wait(boost::bind(&ProjectBrowserComponent::fetchData, boost::asio::placeholders::error, timer)); 
    } 
} 

答えて

3

の関連する部分でありますクラス。ここで私はthisにバインドしました。これはあなたのコードの外観からやっていることです。コメントからseheから

注:

これは非同期操作の全期間のために有効に滞在しなければならないことに注意することが重要です。これを実現する一般的な方法は、enable_shared_from_thisから継承してshared_from_this()

+0

にバインドすることです。非同期操作の全期間にわたって有効である必要があります。これを実現する一般的な方法は、 'ProjectBrowserComponent'を' enable_shared_from_this'から継承させ、 'shared_from_this()'にバインドすることです。 – sehe

関連する問題