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

答えて

1

あなたは子プロセスを殺さないので、実行を継続し、なぜそれいけませんか?これが起こらないようにするには、そのPIDを明示的に使用するKill()が必要です。

また、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にアップグレードするには忙しすぎます... –

関連する問題