2017-05-21 49 views
2

我正在使用wxLua和wxWidgets 2.8.12 for Windows。在下面的代码中,我尝试异步执行一些命令并重定向其输出。当主窗口退出时wx执行的过程不会被删除

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

下面我的代码有什么问题?


require("wx") 

frame = wx.wxFrame(wx.NULL, wx.wxID_ANY, "Test") 

function ExecCommand(cmd) 
    proc = wx.wxProcess(frame) 
    proc:Redirect() 
    pid = wx.wxExecute(cmd, wx.wxEXEC_ASYNC, proc) 
    if pid > 0 then 
     print("process id is " .. tostring(pid)) 
     streamIn = proc and proc:GetInputStream() 
    end 
end 

function ReadStream() 
    if streamIn and streamIn:CanRead() then 
     local str = streamIn:Read(4096) 
    end 
end 

frame:Connect(wx.wxEVT_IDLE, ReadStream) 

frame:Connect(wx.wxEVT_END_PROCESS, function(event) 
    proc = nil 
end) 

frame:Connect(wx.wxEVT_CLOSE_WINDOW, function(event) 
    if proc then proc:Detach() end 
    event:Skip() 
end) 

frame:Show(true) 

cmd = "tree.com C:\\Windows" 

ExecCommand(cmd) 

wx.wxGetApp():MainLoop() 

回答

1

你不杀子进程,所以它继续运行,为什么不呢?如果您不希望发生这种情况,您需要明确使用其PID。

顺便说一句,请同时更新到wxWidgets 3.0,尤其是当您使用Lua时,不应该有任何兼容性问题,但是您将使用支持的版本以及许多新功能和错误修复。 10岁以上2.8。

+0

但是,如果在我关闭主窗口之前完成运行,执行的cmd会自动退出。在这种情况下,我无法在Windows任务管理器中看到“tree.com”进程。为何发生这种差异? –

+0

[wxWidgets documentation](http://docs.wxwidgets.org/stable/classwx_process.html#a19cdb21f39fd9f758c7e3661426bcf9f)说:然而,可能发生的情况是父对象在外部进程终止之前被销毁(例如,一个窗口外部进程已经被用户关闭),在这种情况下,它不应该**删除wxProcess对象,而应该调用Detach()。 –

+0

wxLua开发人员无法将其升级到3.0版本...... –

相关问题