尝试 运行 C++ 代码中的 C++ 可执行文件会停止程序
Trying to run a C++ executable inside a C++ code halts the program
我的目标:每当在网络摄像头中检测到对象时显示一个简单的消息框(“检测到对象”)。
我有一个显示网络摄像头的 C++ opencv 代码 (display_cam.cc)。
我有另一个基本的 PySimpleGUI 代码,运行 在另一个简单显示的 C++ 代码中
带有文本“检测到对象”的文本框 (gui.cc)。
里面 display_cam.cc 我输入了这一行 system("./gui");
现在的问题是,每当相机检测到物体时,GUI 框就会闪烁,但随后是 halting/pausing 代码。我关闭 GUI 框,然后相机流继续,直到再次检测到对象并且代码再次暂停并出现 GUI 闪烁。
std::system
将一直阻塞直到命令退出。它需要,因为它 returns 命令的退出代码。
您有几种解决方法:
将 std::system()
调用放在自己的 std::thread 中。
在命令字符串中使用特定于平台的功能使其成为非阻塞的。例如,在 Linux、macOS 或任何其他 std::system()
恰好为您提供 Posix shell 的平台上,您可以尝试:
system("./gui &")
尾随符号 (&
) runs the process in the background.
使用其他特定于平台的 API 而不是 std::system()
。请参阅 Non-blocking version of system()(关于 C API,不具体 C++,但解决方案应该兼容)。
以某种方式重写您的 ./gui
程序以立即退出其主进程,同时保持其图形 window 打开。同样,使用特定于平台的过程控制 API。
如果您的目标是让“./gui”进程 运行 独立于(即并行)父进程的执行,并且您处于 Mac 或 Linux/Unix系统,最简单的实现方式是:
system("./gui &"); // the ampersand means "run in the background"
如果您需要在 Windows 上 运行,OTOH,您可能需要调用 Win32 CreateProcess() 函数。
不过,生成一个子进程只是为了显示一个消息对话框并不是一个很好的设计,所以如果可能的话,我建议改为从您现有的 GUI 进程中创建一个消息对话框。
我的目标:每当在网络摄像头中检测到对象时显示一个简单的消息框(“检测到对象”)。
我有一个显示网络摄像头的 C++ opencv 代码 (display_cam.cc)。
我有另一个基本的 PySimpleGUI 代码,运行 在另一个简单显示的 C++ 代码中 带有文本“检测到对象”的文本框 (gui.cc)。
里面 display_cam.cc 我输入了这一行 system("./gui");
现在的问题是,每当相机检测到物体时,GUI 框就会闪烁,但随后是 halting/pausing 代码。我关闭 GUI 框,然后相机流继续,直到再次检测到对象并且代码再次暂停并出现 GUI 闪烁。
std::system
将一直阻塞直到命令退出。它需要,因为它 returns 命令的退出代码。
您有几种解决方法:
将
std::system()
调用放在自己的 std::thread 中。在命令字符串中使用特定于平台的功能使其成为非阻塞的。例如,在 Linux、macOS 或任何其他
std::system()
恰好为您提供 Posix shell 的平台上,您可以尝试:system("./gui &")
尾随符号 (
&
) runs the process in the background.使用其他特定于平台的 API 而不是
std::system()
。请参阅 Non-blocking version of system()(关于 C API,不具体 C++,但解决方案应该兼容)。以某种方式重写您的
./gui
程序以立即退出其主进程,同时保持其图形 window 打开。同样,使用特定于平台的过程控制 API。
如果您的目标是让“./gui”进程 运行 独立于(即并行)父进程的执行,并且您处于 Mac 或 Linux/Unix系统,最简单的实现方式是:
system("./gui &"); // the ampersand means "run in the background"
如果您需要在 Windows 上 运行,OTOH,您可能需要调用 Win32 CreateProcess() 函数。
不过,生成一个子进程只是为了显示一个消息对话框并不是一个很好的设计,所以如果可能的话,我建议改为从您现有的 GUI 进程中创建一个消息对话框。