- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在创建一个异步执行多个可执行文件的程序。我的问题是,当我从 std::future 调用 get() 函数时,我的程序没有错误地挂断了。
我正在使用 Boost.Process 来管理流程,也在其他地方使用 wxWidgets。
我的程序创建了一个指向包含 std::future 的新 BProcess 的指针。稍后,计时器功能每隔几毫秒检查一次,以查看每个进程是否已完成。
class BProcess
{
public:
BProcess();
boost::asio::io_service ios;
boost::process::child child_process;
std::future<std::string> future_result;
};
void Module::Execute() //done for each process
{
this->process_handle = new BProcess();
this->process_handle->child_process = boost::process::child(sfilename, boost::process::std_out > this->process_handle->future_result, this->process_handle->ios);
}
void Timer::Notify()
{
//done in loop for each Module - hangs after first module finishes
if (!Modules[i].process_handle->child_process.running())
{
std::string testStr = Modules[i].process_handle->future_result.get();
}
}
编辑:这是 gdb 的“where”输出:我想弄清楚发生了什么。这对任何人都有意义吗?
Timer Started!
Module 0 set to run.
Module 1 set to run.
Module 2 set to run.
You checked/unchecked that item: 1
Executing Module #0
Detaching after fork from child process 17066.
Detaching after fork from child process 17069.
You checked/unchecked that item: 1
Executing Module #1
Detaching after fork from child process 17071.
Detaching after fork from child process 17072.
You checked/unchecked that item: 1
Executing Module #2
Detaching after fork from child process 17074.
Detaching after fork from child process 17075.
[New Thread 0xf5bffb40 (LWP 17078)]
[Thread 0xf33ffb40 (LWP 17063) exited]
Done Executing Module #0
^C
Thread 1 "SecureIT" received signal SIGINT, Interrupt.
0xf7fd3db9 in __kernel_vsyscall ()
Missing separate debuginfos, use: dnf debuginfo-install expat-2.2.4-1.fc26.i686 fontconfig-2.12.6-3.fc26.i686 gdk-pixbuf2-2.36.9-1.fc26.i686 gdk-pixbuf2-modules-2.36.9-1.fc26.i686 libblkid-2.30.2-1.fc26.i686 libffi-3.1-12.fc26.i686 libgcc-7.2.1-2.fc26.i686 libglvnd-0.2.999-24.20170818git8d4d03f.fc26.i686 libglvnd-egl-0.2.999-24.20170818git8d4d03f.fc26.i686 libglvnd-glx-0.2.999-24.20170818git8d4d03f.fc26.i686 libmount-2.30.2-1.fc26.i686 libselinux-2.6-7.fc26.i686 libstdc++-7.2.1-2.fc26.i686 libuuid-2.30.2-1.fc26.i686 pango-1.40.12-1.fc26.i686 pcre-8.41-1.fc26.i686
(gdb) where
#0 0xf7fd3db9 in __kernel_vsyscall ()
#1 0xf6f6e327 in syscall () at /lib/libc.so.6
#2 0xf7166fdb in std::__atomic_futex_unsigned_base::_M_futex_wait_until(unsigned int*, unsigned int, bool, std::chrono::duration<long long, std::ratio<1ll, 1ll> >, std::chrono::duration<long long, std::ratio<1ll, 1000000000ll> >) () at /lib/libstdc++.so.6
#3 0x080cf683 in std::__atomic_futex_unsigned<2147483648u>::_M_load_and_test_until(unsigned int, unsigned int, bool, std::memory_order, bool, std::chrono::duration<long long, std::ratio<1ll, 1ll> >, std::chrono::duration<long long, std::ratio<1ll, 1000000000ll> >) (this=0x8b804e4, __assumed=0, __operand=1, __equal=true, __mo=std::memory_order_acquire, __has_timeout=false, __s=..., __ns=...) at /usr/include/c++/7/bits/atomic_futex.h:102
#4 0x080cf09b in std::__atomic_futex_unsigned<2147483648u>::_M_load_and_test(unsigned int, unsigned int, bool, std::memory_order) (this=0x8b804e4, __assumed=0, __operand=1, __equal=true, __mo=std::memory_order_acquire) at /usr/include/c++/7/bits/atomic_futex.h:122
#5 0x080ce61a in std::__atomic_futex_unsigned<2147483648u>::_M_load_when_equal(unsigned int, std::memory_order) (__mo=std::memory_order_acquire, __val=1, this=0x8b804e4) at /usr/include/c++/7/bits/atomic_futex.h:162
#6 0x080ce61a in std::__future_base::_State_baseV2::wait() (this=0x8b804dc) at /usr/include/c++/7/future:337
#7 0x080cf592 in std::__basic_future<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::_M_get_result() const (this=0x8b80c48) at /usr/include/c++/7/future:717
#8 0x080ceff8 in std::future<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::get() (this=0x8b80c48)
at /usr/include/c++/7/future:796
#9 0x080cdc8b in ExecuteTimer::Notify() (this=0x8bbd460) at ExecuteTimer.cpp:35
#10 0x0833efbf in timeout_callback ()
#11 0xf7415c13 in g_timeout_dispatch (source=source@entry=0x8b80c80, callback=0x833ef80 <timeout_callback>, user_data=0x8bbde00) at gmain.c:4715
#12 0xf7414fc9 in g_main_dispatch (context=0x8a1f698) at gmain.c:3234
#13 0xf7414fc9 in g_main_context_dispatch (context=context@entry=0x8a1f698) at gmain.c:3899
#14 0xf74153f0 in g_main_context_iterate (context=0x8a1f698, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at gmain.c:3972
#15 0xf74157a1 in g_main_loop_run (loop=loop@entry=0x8abf0f0) at gmain.c:4168
#16 0xf7afcc50 in IA__gtk_main () at gtkmain.c:1268
#17 0x08335fc5 in wxGUIEventLoop::DoRun() ()
#18 0x083c0393 in wxEventLoopBase::Run() ()
#19 0x08391921 in wxAppConsoleBase::MainLoop() ()
#20 0x084071db in wxEntry(int&, wchar_t**) ()
#21 0x08083e55 in main(int, char**) (argc=1, argv=0xffffd194) at main.cpp:13
(gdb)
如有任何帮助,我们将不胜感激。如果我没有显示足够的代码,请告诉我。
最佳答案
我认为您可能只是忘记/忽略了运行 io_service。
这是草图。
注意有多个设计问题:
running()
是活泼的。如果它从未运行过,那你就完蛋了。如果您之前已经获得了 future 的值(value),那您就完了。#include <boost/process.hpp>
#include <boost/process/async.hpp>
#include <list>
#include <memory>
struct BProcess {
BProcess(boost::asio::io_service& svc) : ios(svc) {}
void Execute(std::string const& sfilename) {
namespace bp = boost::process;
child_process = bp::child(sfilename, bp::std_out > output, ios);
}
boost::asio::io_service& ios;
boost::process::child child_process;
std::future<std::string> output;
};
struct Module {
Module(boost::asio::io_service& svc) : ios(svc), process(new BProcess(svc)) {}
void Execute(std::string const& sfilename) {
process->Execute(sfilename);
}
bool running() const { return process->child_process.running(); }
std::string get_output() const { return process->output.get(); }
private:
boost::asio::io_service& ios;
std::unique_ptr<BProcess> process;
};
#include <iostream>
struct Timer {
std::list<Module> Modules;
void Notify() {
for (auto& m : Modules) {
if (!m.running()) {
std::string testStr = m.get_output();
std::cout << "Got " << testStr.size() << " bytes of output\n";
std::cout << "---- '" << testStr << "' ---\n";
}
}
}
};
int main() {
boost::asio::io_service ios;
Timer timer;
timer.Modules.emplace_back(ios);
timer.Modules.back().Execute("/usr/bin/find");
timer.Modules.emplace_back(ios);
timer.Modules.back().Execute("/usr/bin/gcc");
for (auto& m : timer.Modules)
m.Execute("/usr/bin/find");
ios.run();
timer.Notify();
}
关于c++ - 使用 Boost.Process 进行异步调用 std::future.get() 后程序挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47085421/
为了让我的代码几乎完全用 Jquery 编写,我想用 Jquery 重写 AJAX 调用。 这是从网页到 Tomcat servlet 的调用。 我目前情况的类似代码: var http = new
我想使用 JNI 从 Java 调用 C 函数。在 C 函数中,我想创建一个 JVM 并调用一些 Java 对象。当我尝试创建 JVM 时,JNI_CreateJavaVM 返回 -1。 所以,我想知
环顾四周,我发现从 HTML 调用 Javascript 函数的最佳方法是将函数本身放在 HTML 中,而不是外部 Javascript 文件。所以我一直在网上四处寻找,找到了一些简短的教程,我可以根
我有这个组件: import {Component} from 'angular2/core'; import {UserServices} from '../services/UserService
我正在尝试用 C 实现一个简单的 OpenSSL 客户端/服务器模型,并且对 BIO_* 调用的使用感到好奇,与原始 SSL_* 调用相比,它允许一些不错的功能。 我对此比较陌生,所以我可能会完全错误
我正在处理有关异步调用的难题: 一个 JQuery 函数在用户点击时执行,然后调用一个 php 文件来检查用户输入是否与数据库中已有的信息重叠。如果是这样,则应提示用户确认是否要继续或取消,如果他单击
我有以下类(class)。 public Task { public static Task getInstance(String taskName) { return new
嘿,我正在构建一个小游戏,我正在通过制作一个数字 vector 来创建关卡,该数字 vector 通过枚举与 1-4 种颜色相关联。问题是循环(在 Simon::loadChallenge 中)我将颜
我有一个java spring boot api(数据接收器),客户端调用它来保存一些数据。一旦我完成了数据的持久化,我想进行另一个 api 调用(应该处理持久化的数据 - 数据聚合器),它应该自行异
首先,这涉及桌面应用程序而不是 ASP .Net 应用程序。 我已经为我的项目添加了一个 Web 引用,并构建了各种数据对象,例如 PayerInfo、Address 和 CreditCard。但问题
我如何告诉 FAKE 编译 .fs文件使用 fsc ? 解释如何传递参数的奖励积分,如 -a和 -target:dll . 编辑:我应该澄清一下,我正在尝试在没有 MSBuild/xbuild/.sl
我使用下划线模板配置了一个简单的主干模型和 View 。两个单独的 API 使用完全相同的配置。 API 1 按预期工作。 要重现该问题,请注释掉 API 1 的 URL,并取消注释 API 2 的
我不确定什么是更好的做法或更现实的做法。我希望从头开始创建目录系统,但不确定最佳方法是什么。 我想我在需要显示信息时使用对象,例如 info.php?id=100。有这样的代码用于显示 Game.cl
from datetime import timedelta class A: def __abs__(self): return -self class B1(A):
我在操作此生命游戏示例代码中的数组时遇到问题。 情况: “生命游戏”是约翰·康威发明的一种细胞自动化技术。它由一个细胞网格组成,这些细胞可以根据数学规则生存/死亡/繁殖。该网格中的活细胞和死细胞通过
如果我像这样调用 read() 来读取文件: unsigned char buf[512]; memset(buf, 0, sizeof(unsigned char) * 512); int fd;
我用 C 编写了一个简单的服务器,并希望调用它的功能与调用其他 C 守护程序的功能相同(例如使用 ./ftpd start 调用它并使用 ./ftpd stop 关闭该实例)。显然我遇到的问题是我不知
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
我希望能够从 cmd 在我的 Windows 10 计算机上调用 python3。 我已重新安装 Python3.7 以确保选择“添加到路径”选项,但仍无法调用 python3 并使 CMD 启动 P
我是一名优秀的程序员,十分优秀!