【问题标题】:Trying to run a C++ executable inside a C++ code halts the program尝试在 C++ 代码中运行 C++ 可执行文件会停止程序
【发布时间】:2021-04-15 09:41:44
【问题描述】:

我的目标:只要在网络摄像头中检测到对象,就会显示一个简单的消息框(“检测到对象”)。

我有一个显示网络摄像头的 C++ opencv 代码 (display_cam.cc)。

我有另一个基本的 PySimpleGUI 代码,它在另一个 c++ 代码中运行,它只是显示 带有文本“检测到对象”(gui.cc) 的文本框。

在display_cam.cc里面我输入了这行system("./gui");

现在的问题是,每当相机检测到物体时,GUI 框都会闪烁,但随后会暂停/暂停代码。我已经关闭了 GUI 框,然后摄像头流继续,直到再次检测到对象并且代码再次暂停,GUI 闪烁。

【问题讨论】:

    标签: c++ python-3.x pysimplegui


    【解决方案1】:

    如果您的目标是让“./gui”进程独立于父进程的执行(即并行)运行,并且您使用的是 Mac 或 Linux/Unix 系统,那么实现这一目标的最简单方法是:

    system("./gui &");   // the ampersand means "run in the background"
    

    如果您需要在 Windows 上运行,OTOH,您可能需要改为调用 Win32 CreateProcess() 函数。

    生成一个子进程只是为了显示一个消息对话框并不是一个很好的设计,所以如果可能的话,我建议从现有的 GUI 进程中创建一个消息对话框。

    【讨论】:

    • 如何杀死这个进程?否则,只要检测到对象,就会产生很多这样的进程
    【解决方案2】:

    std::system 将一直阻塞,直到命令退出。它需要,因为它返回命令的退出代码。

    你有几种方法可以解决这个问题:

    1. std::system() 调用放在它自己的std::thread 中。

    2. 在命令字符串中使用特定于平台的功能使其无阻塞。例如,在 Linux、macOS 或std::system() 恰好为您提供 Posix shell 的任何其他平台上,您可以尝试:

      system("./gui &")
      

      尾随的 & 号 (&) runs the process in the background

    3. 使用其他特定于平台的 API 代替 std::system()。请参阅Non-blocking version of system()(这是关于 C API,而不是具体 C++,但解决方案应该是兼容的)。

    4. 以某种方式重写您的./gui 程序以立即退出其主进程,同时保持其图形窗口打开。同样,使用特定于平台的过程控制 API。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多