运行应用并以便携式方式忘记

时间:2015-09-18 19:44:07

标签: c++ multithreading stdthread

我正在编写一个从主程序调用的小型更新程序实用程序。主程序在调用之后立即终止,让更新程序复制所有更新的文件,然后重新启动主程序。然而,最后一点开始让我头疼。

我可以使用std::system运行程序(我知道,不安全,但是可移植)就好了,但是更新程序只是挂在那里等待主程序完成。我正在寻找打电话的方法 fire&忘了,线程似乎是最好的主意。

但是这个:

std::system("app");

在等待从system返回时挂起更新程序。鉴于此:

std::thread(std::system, "app").detach();

也不是变种

std::thread t(std::system, "app");
t.detach();

似乎做了什么。但是当我加入线程时:

std::thread t(std::system, "app");
t.join();

它确实运行了应用程序,但仍然像原始代码一样等待它的返回。为什么分离的线程不能运行应用程序?

2 个答案:

答案 0 :(得分:2)

任何线程,无论是否分离,如果其进程完成(在大多数系统上)将会死亡。在更新程序结束执行之前给出一些时间,并且线程可能能够实际进行调用:

#include <chrono>
#include <cstdlib>
#include <thread>

void do_app() {
  std::system("app");
}

int main() {
  std::thread(do_app).detach();
  std::this_thread::sleep_for(std::chrono::seconds(2));
} 

答案 1 :(得分:1)

我只是在不同的实现中使用ifdef块。对于Windows,您可以使用CreateProcess,linux(可能还有Mac)支持POSIX popen / fork方法。

std :: system并没有真正使你的程序可移植,通常在shell上调用东西的语法因平台而略有不同,你最终会得到与平台相关的代码。

以下是有关如何在Linux中执行此操作的详细教程: http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html

对于Windows: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx