如何在指定的时间内执行任意函数并获取其返回值?

Posted

技术标签:

【中文标题】如何在指定的时间内执行任意函数并获取其返回值?【英文标题】:How can I execute an arbitrary function for a specified amount of time, and get its return value? 【发布时间】:2013-03-19 02:01:40 【问题描述】:

我最初尝试this answer,但在将'bind' 的值分配给'int'(在这种情况下是我的函数的返回类型)时出现编译错误。我对提升相当不熟悉,但正在努力改进。关于如何使下面的代码在 VC10 上编译和正常工作有什么建议吗?

template <class T, class F>
void ExecuteWithReturn(const F &_bind, long sleep, T & ret)

    ret = _bind();


template <class T, class F>
bool TryExecuteFor(const F &_bind, long sleep, T & ret) 
    boost::thread thrd(ExecuteWithReturn<T, F>, _bind, boost::ref(ret));
    return thrd.timed_join(boost::posix_time::milliseconds(sleep));

这样的结果是编译错误:

错误 C2198: 'void (__cdecl *)(const boost::_bi::bind_t &,long,T &)' : 用 1> [ 1> 调用的参数太少 R=long, 1> F=long (__cdecl *)(const wchar_t *,const wchar_t *,wchar_t **), 1> L=boost::_bi::list3,boost::_bi::value,boost::_bi::value>, 1> T=int 1> ]

而这个函数的用法预计是:

int ret;
if(!TryExecuteFor(boost::bind(g_pMyFunc, someParam, anotherParam), 10000, ret))

   ...

编辑:感谢 Fraser 指出 ExecuteWithReturn 的明显问题;结合另一个修复程序使代码工作。运行后,我意识到一个很可能的问题,如果线程是孤立的,则传入的变量(包括返回值)可能会在函数返回之前超出范围。我对绑定函子的参数无能为力,但为了减轻潜在问题,我将返回值更改为 shared_ptr。目前的工作实现如下:

template <class F>
void ExecuteWithReturn(const F &_bind, boost::shared_ptr<decltype(_bind())> _ret)

    *_ret = _bind();


template <class F>
bool TryExecuteFor(const F &_bind, long _timeout, boost::shared_ptr<decltype(_bind())> _ret) 
    boost::thread thrd(ExecuteWithReturn<F>, boost::ref(_bind), _ret);
    return thrd.timed_join(boost::posix_time::milliseconds(_timeout));

nice easy TODO 将是不返回值的函数的重载,但经过基本测试后,它可以按预期工作。

【问题讨论】:

【参考方案1】:

你只是在ExecuteWithReturn多了一个参数

函数应该改成

void ExecuteWithReturn(const F &_bind, T & ret)

否则你需要在你调用ExecuteWithReturn的地方传递sleep参数:

boost::thread thrd(ExecuteWithReturn<T, F>, _bind, sleep, boost::ref(ret));

【讨论】:

嗯。我觉得有点傻没有注意到这一点。它实际上并没有解决问题。我留下了“无法将参数 1 从 long 转换为 funcType”,当我替换 _bind' in boost::thread thrd(ExecuteWithReturn, _bind, boost::ref(ret));` boost::ref(_bind).

以上是关于如何在指定的时间内执行任意函数并获取其返回值?的主要内容,如果未能解决你的问题,请参考以下文章

执行sql操作后如何获取其返回值

PHP如何调用JS函数并获取其返回的数据?

如何在不使用闭包的情况下快速执行SelectorOnMainThread 并获取返回值?

如何使用线程去执行一个 有返回值的方法,并获取返回值?

linux shell中获得进程返回值

我们如何在我们的 android 应用程序中执行一个 javascript 函数并获得一个返回值?