从辅助线程启动可执行文件

时间:2014-03-02 08:21:40

标签: c++ multithreading ipc wxwidgets

我需要一种从辅助线程启动可执行文件(进程)的方法。我使用的wxWidgets工具包让我无法掌握所有知识,现在我必须寻求依赖于平台的方式(仅限Linux和Windows)。

可执行文件将读取和写入文件。除了知道进程是否仍在运行(以及可能的退出代码)之外,这个线程与进程本身没什么关系。进程终止后,线程将读取写入的文件,进行分析并将结果发送到GUI线程进行显示。我不知道怎么做,因为我一直依赖wxExecute

2 个答案:

答案 0 :(得分:2)

你真的想要单独的进程,还是线程呢。

要获得单独的进程,需要Linux的fork()和Windows的CreateProcess()。最好的方法通常是创建一个封装它的函数。

bool RunProces(const std::string &sCmdLine)
{
    #if defined(WIN32)
        // launch with CreateProcess() ...
    #else
        // launch with fork() ...
    #endif
    return bSuccess;
}

但是,如果您可以使用线程,则可以使用可移植的std :: thread类。

另一种方法是使用popen()_popen()用于Windows)。这将启动一个新进程并将其输出(stdout)重定向到管道。然后,您可以读取管道以检索子流程输出。

关于popen()的几点说明:

  1. 重定向标准输出使子流程与用户交互变得不切实际。
  2. 设置管道会有一些开销。除非你产生大量的子流程,否则可能并不重要。
  3. 我从未见过popen()用于启动非控制台Windows程序(没有main()功能)。如果出现问题,我不会感到惊讶。

答案 1 :(得分:1)

您必须将代码的很多部分从辅助线程移动到主线程。您引用的wxWidgets documentation说明了一切:

  

当wxProcess对象传递给wxExecute()时,它的OnTerminate()   进程终止时调用虚方法。这允许   程序(异步)通知进程终止   并检索其不可用的退出状态   在异步执行的情况下是wxExecute()。

以下:

  

目前wxExecute()只能在主线程中使用,调用   来自另一个线程的此函数将导致断言失败   调试构建并且不起作用。

因此,您需要无需从辅助线程调用wxExecute。你应该如何做到这一点取决于你的应用程序,但它可能涉及辅助线程使用wxQueueEvent向主线程发送自定义wxWidgets事件。然后,主线程通过在异步模式中调用wxExecute并稍后检索其结果来处理事件。

现在该如何处理结果?

理想情况下,您重写应用程序逻辑,以便辅助线程不需要结果,而是:

  1. 主线程自行处理, - 或 -
  2. 启动另一个辅助线程并处理它。
  3. 这将最大限度地减少您必须执行的同步量,从而降低难以发现的并发编程错误的可能性。