我需要一种从辅助线程启动可执行文件(进程)的方法。我使用的wxWidgets工具包让我无法掌握所有知识,现在我必须寻求依赖于平台的方式(仅限Linux和Windows)。
可执行文件将读取和写入文件。除了知道进程是否仍在运行(以及可能的退出代码)之外,这个线程与进程本身没什么关系。进程终止后,线程将读取写入的文件,进行分析并将结果发送到GUI线程进行显示。我不知道怎么做,因为我一直依赖wxExecute。
答案 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()
的几点说明:
popen()
用于启动非控制台Windows程序(没有main()
功能)。如果出现问题,我不会感到惊讶。答案 1 :(得分:1)
您必须将代码的很多部分从辅助线程移动到主线程。您引用的wxWidgets documentation说明了一切:
当wxProcess对象传递给wxExecute()时,它的OnTerminate() 进程终止时调用虚方法。这允许 程序(异步)通知进程终止 并检索其不可用的退出状态 在异步执行的情况下是wxExecute()。
以下:
目前wxExecute()只能在主线程中使用,调用 来自另一个线程的此函数将导致断言失败 调试构建并且不起作用。
因此,您需要无需从辅助线程调用wxExecute
。你应该如何做到这一点取决于你的应用程序,但它可能涉及辅助线程使用wxQueueEvent
向主线程发送自定义wxWidgets事件。然后,主线程通过在异步模式中调用wxExecute
并稍后检索其结果来处理事件。
现在该如何处理结果?
理想情况下,您重写应用程序逻辑,以便辅助线程不需要结果,而是:
这将最大限度地减少您必须执行的同步量,从而降低难以发现的并发编程错误的可能性。