2017-05-21 39 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版本...... –

相關問題