Asynchronous 主窗口退出时不会删除wxExecuted进程

Asynchronous 主窗口退出时不会删除wxExecuted进程,asynchronous,process,wxwidgets,child-process,wxlua,Asynchronous,Process,Wxwidgets,Child Process,Wxlua,我正在将wxLua与用于Windows的wxWidgets 2.8.12一起使用。在下面的代码中,我尝试异步执行一些命令并重定向其输出 问题是,如果在子进程终止之前关闭主窗口,子进程不会被删除。在这个wxLua应用程序退出后,我仍然可以在Windows任务管理器中看到“tree.com”进程 下面的代码有什么问题 require(“wx”) frame=wx.wxFrame(wx.NULL,wx.wxID_ANY,“测试”) 函数ExecCommand(cmd) proc=wx.wxProce

我正在将wxLua与用于Windows的wxWidgets 2.8.12一起使用。在下面的代码中,我尝试异步执行一些命令并重定向其输出

问题是,如果在子进程终止之前关闭主窗口,子进程不会被删除。在这个wxLua应用程序退出后,我仍然可以在Windows任务管理器中看到“tree.com”进程

下面的代码有什么问题


require(“wx”)
frame=wx.wxFrame(wx.NULL,wx.wxID_ANY,“测试”)
函数ExecCommand(cmd)
proc=wx.wxProcess(帧)
进程:重定向()
pid=wx.wxExecute(cmd,wx.wxEXEC_ASYNC,proc)
如果pid>0,则
打印(“进程id为”。.tostring(pid))
streamIn=proc和proc:GetInputStream()
结束
结束
函数ReadStream()
如果streamIn和streamIn:CanRead()那么
本地str=streamIn:Read(4096)
结束
结束
帧:连接(wx.wxEVT_空闲,读流)
帧:连接(wx.wxEVT_END_进程,函数(事件)
proc=nil
(完)
框架:连接(wx.wxEVT_关闭_窗口,功能(事件)
如果是proc,则proc:Detach()结束
事件:跳过()
(完)
帧:显示(真)
cmd=“tree.com C:\\Windows”
ExecCommand(cmd)
wx.wxGetApp():MainLoop()

您没有杀死子进程,所以它继续运行,为什么不应该呢?如果不希望发生这种情况,则需要使用其PID显式地
Kill()


顺便说一句,请同时更新到wxWidgets 3.0,特别是当您使用Lua时,不应该存在任何兼容性问题,但与10多年前的2.8相比,您将使用一个支持的版本,该版本具有许多新功能和错误修复。

但是如果在我关闭主窗口之前完成运行,执行的cmd将自动退出。在本例中,我无法在Windows任务管理器中看到“tree.com”进程。为什么会出现这种差异?说明:但是,在外部进程终止之前,可能会销毁父对象(例如,用户关闭启动此外部进程的窗口),在这种情况下,不应删除wxProcess对象,而应调用Detach()相反,在代码> WXPrtudio< /Cord> C++对象和由其PID标识的外部进程之间存在差异。你似乎混淆了两者。通常,cmd会自动退出,所以我们不需要杀死它。我不明白,在wxwidgets中,如果我们很快关闭主窗口,是什么阻止它退出?它可能在重定向管道的末端阻塞,尽管这确实令人惊讶,但我认为它应该在写入关闭的管道时出错。我理解了你最初的帖子:为什么子进程不立即退出,如果它根本不退出,那就不一样了,恐怕我真的不知道发生了什么。