2
Windows 용 wxLidgets 2.8.12와 함께 wxLua를 사용하고 있습니다. 다음 코드에서는 비동기 적으로 일부 명령을 실행하고 출력을 리디렉션하려고합니다.기본 창이 종료되면 wxExecuted 프로세스가 삭제되지 않습니다
자식 프로세스가 종료되기 전에 기본 창을 닫으면 자식 프로세스가 삭제되지 않습니다. 이 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()
그러나 실행 된 cmd는 주 윈도우를 닫기 전에 실행이 끝나면 자동으로 종료됩니다. 이 경우 Windows 작업 관리자에서 "tree.com"프로세스를 볼 수 없습니다. 왜이 차이가 발생합니까? –
[wxWidgets documentation] (http://docs.wxwidgets.org/stable/classwx_process.html#a19cdb21f39fd9f758c7e3661426bcf9f) : 그러나 외부 프로세스가 종료되기 전에 부모 개체가 파괴 될 수 있습니다 (예 : 외부 프로세스가 시작된 경우 사용자가 종료합니다.)이 경우에는 wxProcess 객체를 삭제하지 않고 ** Detach()를 호출해야합니다. –
wxLua 개발자가 너무 바빠 버전 3.0으로 업그레이드 할 수 없습니다 ... –