Как использовать boost::async_system?
Я новичок в повышении, а также в многопоточности и запуске приложений с использованием библиотек. Для моей желаемой функциональности коллега рекомендовал мне использовать библиотеку boost::process.
Но документации к этой части boost недостаточно, поэтому я не смог определить, какая функция лучше всего подходит для моей задачи, по документации. Поэтому я начал пробовать там несколько функций, но non обладает всеми желаемыми свойствами.
Однако есть один, который я не могу понять, как правильно использовать. Я даже не могу скомпилировать его, не говоря уже о том, чтобы запустить его. И функция является boost::process::async_system. Я нигде не мог найти в интернете пошаговое руководство о том, как использовать эту функцию и что означают и делают отдельные компоненты.
Может ли кто-нибудь подробно объяснить мне отдельные аргументы и аргументы шаблона функции? Или предоставить ссылку на подробное руководство?
1 ответ
Мне нравятся примеры здесь: https://theboostcpplibraries.com/boost.thread-futures-and-promises
Например, посмотрите на пример 44.16, они ясно показывают, как использовать async:
#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) вам необходимо установить заголовки include и библиотеки boost для его использования. Ссылка выше помогает и в этом.
Я просто перехожу на Boost.Process, но здесь может быть полезен пример кода, над которым я работаю.
boost:: process: async_system() принимает 3 параметра: объект boost::asio::io_context, функцию обработчика выхода и команду, которую вы хотите запустить (точно так же, как system(), и это может быть либо одна строка или более одного аргумента).
После его вызова вы используете объект 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