0

我目前正在编写一个 firebreath C++ NPAPI 插件,并且我试图从插件内部调用 boost::thread。我正在构建的平台是 Ubuntu Linux 13.04。这是类声明和相关成员函数实现的骨架:

class EmulatorLaunchPluginAPI : public FB::JSAPIAuto
{
public:
   EmulatorLaunchPluginAPI(const EmulatorLaunchPluginPtr& plugin, 
                          const FB::BrowserHostPtr& host):m_plugin(plugin), m_host(host)
  {
      registerMethod("launch_emulator", 
                   make_method(this, &EmulatorLaunchPluginAPI::launch_emulator));
       registerMethod("launch_emulator_thread", 
                   make_method(this, &EmulatorLaunchPluginAPI::launch_emulator_thread));
  }
    virtual ~EmulatorLaunchPluginAPI() {};
    EmulatorLaunchPluginPtr getPlugin()
    {
        EmulatorLaunchPluginPtr plugin(m_plugin.lock());
        if (!plugin) {
            throw FB::script_error("The plugin is invalid");
        }
        return plugin;
    }  

    bool launch_emulator(const std::string& ,const FB::JSObjectPtr& )
    {
         emt(boost::bind(//boost::type<void>(),
        &EmulatorLaunchPluginAPI::launch_emulator_thread,
        this,
        cmd,
                callback));
        return true;
    }
    void launch_emulator_thread(const std::string& , const FB::JSObjectPtr& )
    {
         //thread body logic here
         int result = 0;
         result = invoke_command(cmd); 
         //callback to the browser
         callback->InvokeAsync("", FB::variant_list_of(shared_from_this())(result));
    }

private:
    int invoke_command(const std::string& )
    {
        int res = system("/usr/bin/firefox"); 
        return res;
    }

    EmulatorLaunchPluginWeakPtr m_plugin;
    FB::BrowserHostPtr m_host;
    boost::thread emt;  
};

I am getting the following compile error for the code fragmented highlighted above:

[ 54%] 构建 CXX 对象项目/EmulatorLaunchPlugin/CMakeFiles/EmulatorLaunchPlugin.dir/EmulatorLaunchPluginAPI.cpp.o /home/ajay/Downloads/firebreath-FireBreath-c335f5b/projects/EmulatorLaunchPlugin/EmulatorLaunchPluginAPI.cpp:在成员函数'bool EmulatorLaunchPluginAPI: :launch_emulator(const string&, const JSObjectPtr&)': /home/ajay/Downloads/firebreath-FireBreath-c335f5b/projects/EmulatorLaunchPlugin/EmulatorLaunchPluginAPI.cpp:94:30: 错误:不匹配调用'(boost::thread) (boost::_bi::bind_t&, const boost::shared_ptr&>, boost::_bi::list3, boost::_bi::value >, boost::_bi::value > > >)' make[2]: * [projects/EmulatorLaunchPlugin/CMakeFiles/EmulatorLaunchPlugin.dir/EmulatorLaunchPluginAPI.cpp.o] 错误 1 ​​make[1]:[projects/EmulatorLaunchPlugin/CMakeFiles/EmulatorLaunchPlugin.dir/all] 错误 2 make: * * [all] 错误 2

我是 Boost 库的新手,我确实尝试了解 boost::bind 的工作原理,但我无法解决此错误。有人可以帮我理解编译器的行为吗?

问候, 阿杰

4

2 回答 2

0

尝试将行更改为:

emt = boost::thread(&EmulatorLaunchPluginAPI::launch_emulator_thread, this, cmd, callback));
于 2013-08-16T18:26:38.153 回答
0

我仍然没有清楚地看到错误消息(特别是我对shared_ptrw/oa 模板类型感到困惑并>在它之后晃来晃去),但无论如何我在您的代码中看到了一些错误:

  1. launch_emulator使用此代码无法观察到的 smth。例如 smth 命名cmdcallback。使用我的心灵感应,我猜错过了函数参数名称(我正确吗?)

  2. 该类包含未初始化 boost::thread的实例 - 您必须在 ctor 中对其进行初始化,因为此类没有复制 ctor 或分配运算符(对于 C++11 模式,它具有移动构造函数/分配

  3. 例如,在launch_emulator你打电话。这个班级没有这样的成员......所以我想你实际上关于这个事实的简短错误消息......operator()boost::thread

于 2013-08-16T11:08:32.403 回答