2

我对 boost 以及使用库的多线程和启动应用程序都很陌生。对于我想要的功能,同事推荐我使用 boost::process 库。

但是这部分 boost 的文档是相当不足的,所以我无法通过文档确定哪个函数最适合我的任务。因此,我开始在那里尝试几个功能,但 non 具有所有所需的属性。

但是有一个我不知道如何正确使用。我什至无法编译它,更不用说运行它了。函数是 boost::process::async_system。我在互联网上的任何地方都找不到有关如何使用此功能以及各个组件的含义和作用的分步指南。

有人可以向我详细解释函数的各个参数和模板参数吗?或者提供详细手册的链接?

4

2 回答 2

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 headers 才能使用它。上面的链接也对此有所帮助。

于 2019-01-28T12:07:49.753 回答
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
于 2019-07-03T04:11:39.623 回答