对于提升功能以及使用库进行多线程和启动应用程序,我是一个新手。为了达到理想的功能,同事建议我使用boost :: process库。
但是关于boost的这一部分的文档还不够,因此我无法通过文档确定哪个功能最适合我的任务。因此,我开始在那里尝试几个功能,但是没有所有所需的属性。
但是我无法弄清楚如何正确使用它。我什至无法编译它,更不用说运行它了。函数是boost :: process :: async_system。我无法在Internet上的任何地方找到有关如何使用此功能以及各个组件的含义和作用的分步指南。
有人可以向我详细解释该函数的各个参数和模板参数吗?还是提供详细手册的链接?
答案 0 :(得分:1)
我喜欢这里的示例:https://theboostcpplibraries.com/boost.thread-futures-and-promises
例如,看示例44.16,它们清楚地显示了如何使用异步:
#define BOOST_THREAD_PROVIDES_FUTURE
#include <boost/thread.hpp>
#include <boost/thread/future.hpp>
#include <iostream>
int accumulate()
{
int sum = 0;
for (int i = 0; i < 5; ++i)
sum += i;
return sum;
}
int main()
{
boost::future<int> f = boost::async(accumulate);
std::cout << f.get() << '\n';
}
等待发生在get
方法上,而不是之前。您也可以使用非等待机制。
关于编译,您需要首先构建boost。此处详细说明了构建过程:https://www.boost.org/doc/libs/1_62_0/more/getting_started/windows.html
该库的大部分仅工作于标头。对于asio
,必须构建二进制库(也在链接中说明)。在您的专案(例如Visual Studio专案,xcode专案或某些Make文件)中,您需要设定boost的include和library标头以使用它。上面的链接也对此有所帮助。
答案 1 :(得分:0)
我只是在加速Boost.Process,但是我正在使用的示例代码在这里可能会有所帮助。
boost::process:async_system()带有3个参数:boost::asio::io_context对象,退出处理函数和要运行的命令(就像system()一样,它可以是一行或一个以上的arg)。
在调用之后,您可以使用调用线程中的io_context对象来管理和监视异步任务-我使用run_one()方法,它将“运行io_context对象的事件处理循环以执行最多一个处理程序”,但是您也可以使用其他方法运行一段时间等。
这是我的工作代码:
#include <boost/process.hpp>
#include <iostream>
using namespace boost;
namespace {
// declare exit handler function
void _exitHandler(boost::system::error_code err, int rc) {
std::cout << "DEBUG async exit error code: "
<< err << " rc: " << rc <<std::endl;
}
}
int main() {
// create the io_context
asio::io_context ioctx;
// call async_system
process::async_system(ioctx, _exitHandler, "ls /usr/local/bin");
std::cout << "just called 'ls /usr/local/bin', async" << std::endl;
int breakout = 0; // safety for weirdness
do {
std::cout << " - checking to see if it stopped..." << std::endl;
if (ioctx.stopped()) {
std::cout << " * it stopped!" << std::endl;
break;
} else {
std::cout << " + calling io_context.run_one()..." << std::endl;
ioctx.run_one();
}
++breakout;
} while (breakout < 1000);
return 0;
}
我的示例唯一缺少的是如何使用boost :: asio :: async_result捕获结果-我所看到的示例(包括slashdot上的示例)对我来说仍然没有多大意义,但希望这很有帮助。
这是我系统上的上述输出:
just called 'ls /usr/local/bin', async
- checking to see if it stopped...
+ calling io_context.run_one()...
- checking to see if it stopped...
+ calling io_context.run_one()...
VBoxAutostart easy_install pybot
VBoxBalloonCtrl easy_install-2.7 pyi-archive_viewer
((omitted - a bunch more files from the ls -l command))
DEBUG async exit error code: system:0 rc: 0
- checking to see if it stopped...
* it stopped!
Program ended with exit code: 0