1

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

问题是,如果我在子进程终止之前关闭主窗口,子进程不会被删除。在这个 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()
4

1 回答 1

1

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

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

于 2017-05-21T12:20:56.450 回答