Процесс wxExecuted не удаляется при выходе из главного окна

Я использую wxLua с wxWidgets 2.8.12 для Windows. В следующем коде я пытаюсь асинхронно выполнить некоторую команду и перенаправить ее вывод.

Проблема в том, что если я закрою главное окно до завершения дочернего процесса, дочерний процесс не будет удален. После завершения работы этого приложения wxLua я все еще мог видеть процесс tree.com в диспетчере задач Windows.

В чем проблема с моим кодом ниже?


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 ответ

Решение

Вы не убиваете дочерний процесс, поэтому он продолжает работать, почему бы и нет? Если вы не хотите, чтобы это произошло, вам нужно Kill() он явно использует свой PID.

Кстати, пожалуйста, также обновите до wxWidgets 3.0, особенно если вы используете Lua, проблем с совместимостью не должно быть, но вы бы использовали поддерживаемую версию с множеством новых функций и исправлений ошибок по сравнению с 10+ годами. 2,8.

Другие вопросы по тегам