如何在指定的时间内执行任意函数并获取其返回值?
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(ExecuteWithReturnboost::ref(_bind)
.以上是关于如何在指定的时间内执行任意函数并获取其返回值?的主要内容,如果未能解决你的问题,请参考以下文章