Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何停止qt中的分离进程?_C++_Qt_Qtcore_Qprocess - Fatal编程技术网

C++ 如何停止qt中的分离进程?

C++ 如何停止qt中的分离进程?,c++,qt,qtcore,qprocess,C++,Qt,Qtcore,Qprocess,在使用QProcess::StartDetailed启动流程后,如何在以后停止它 假设主程序运行,然后启动独立运行的分离进程。用户关闭主程序,然后再次打开它并希望停止该过程。我如何找到这个过程,然后停止它 是否有一种方法可以防止应用程序从同一进程中运行两次 不,它将与您的应用程序分离。您可以获得它的PID,然后在Linux上发送一个SIGSTOP,但这是特定于平台的,没有POSIX支持就无法工作,就像msvc一样。你需要手工制作你的版本 是否有一种方法可以防止应用程序从同一进程中运行两次 是的,

在使用
QProcess::StartDetailed
启动流程后,如何在以后停止它

假设主程序运行,然后启动独立运行的分离进程。用户关闭主程序,然后再次打开它并希望停止该过程。我如何找到这个过程,然后停止它


是否有一种方法可以防止应用程序从同一进程中运行两次

不,它将与您的应用程序分离。您可以获得它的PID,然后在Linux上发送一个SIGSTOP,但这是特定于平台的,没有POSIX支持就无法工作,就像msvc一样。你需要手工制作你的版本


是否有一种方法可以防止应用程序从同一进程中运行两次

是的,通过在分离过程中使用锁文件。如果分离的进程碰巧至少部分用Qt编写,则可以使用


如果您碰巧分离了某个特定于平台的流程,那么您肯定会再次遇到同样的问题。

以下是我找到的答案:

我首先启动分离的进程,该进程生成一个唯一的id。该进程在运行时写入文件(是一个1分钟的计时器)。当它运行时,它将其id写入一个文件。然后,如果碰巧有另一个运行了,如果它看到前一个运行了,它只会将其id写入文件而不运行,然后,当下一个运行时,它会看到其id是否已经在文件中,如果已经在文件中,它会关闭自身并清除文件,然后下一个运行会自由运行,成为唯一运行的运行。这可能会跳过一段时间


您也可以添加时间戳,因为这可能表明它最近没有运行,并有助于决定是否关闭它。问题是,如果我只是将id写入一个文件,当我关闭手机时,该文件会显示它仍在运行。这同样适用于它崩溃的情况。

仅通过使用依赖于平台的方法来定位进程,然后发出命令将其杀死。当一个进程以分离方式启动,并且Qt程序退出后,您无法通过QProcess控制该进程。在这种情况下,我的解决方案是编写一个文件来管理每个进程读取的进程。谢谢,有没有一种方法可以防止同一进程中的应用程序重复两次?我曾想过使用一个文件,但如果手机关机或进程崩溃,该文件仍会说它正在运行,不会让它再次启动。我确实找到了一个方法。这有点做作。我首先启动分离的进程,该进程生成一个唯一的id。该进程在运行时写入文件(是一个1分钟的计时器)。当它运行时,它将其id写入一个文件。然后,如果碰巧有另一个运行了,如果它看到前一个运行了,它只会将其id写入文件而不运行,然后,当下一个运行时,它会看到其id是否已经在文件中,如果已经在文件中,它会关闭自身并清除文件,然后下一个运行会自由运行,成为唯一运行的运行。这可能会跳过一段时间。您也可以添加时间戳,因为这可能表明它最近没有运行,并有助于决定是否关闭它。问题是,如果我只是将id写入一个文件,当我关闭手机时,该文件会显示它仍在运行。这同样适用于if崩溃。这是一个比我发现的更干净的解决方案,这个解决方案只是在进程启动时无限期地锁定一个文件,当主程序尝试启动另一个进程时,它会检查另一个进程是否被锁定。但是,这可能会导致在文件最近崩溃的情况下错误地将其标识为锁定,或者可能是手机重新启动(不确定在这种情况下是否将其解锁),并且该文件还没有被宣布为陈旧和解锁,因此该文件的可靠性稍差,可能会导致用户不满意。@JVE999:我不这么认为。默认情况下,锁文件在30秒后会自动失效。我没有注意到。嗯,那是个好办法。为了安全起见,我想在尝试启动进程之前设置一个31秒的计时器。如果由于某种原因,进程在计时器运行时崩溃(当然不应该),它将不会启动,但否则应该可以工作。我将把它留给评论,因为可能有一个更好的。我错过了这个答案试图达到的目的。PID已经是唯一的,它由QLockFile放入文件中。默认情况下,锁文件也会在30秒内自动失效,所以在我看来,你是在重新发明轮子,基本上就是我四个月前写的东西。