2
Windows用wxLidgets 2.8.12を使用しています。次のコードでは、非同期的にコマンドを実行し、その出力をリダイレクトしようとしています。メインウィンドウの終了時に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にアップグレードするには忙しすぎます... –