2017-05-21 7 views
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() 

답변

1

당신은 자식 프로세스를 종료하지 않는, 그래서 계속 실행, 왜해야하지? 이 문제가 발생하지 않게하려면 Kill()에 PID를 명시 적으로 사용해야합니다.

아직 wuaWidgets 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으로 업그레이드 할 수 없습니다 ... –