2016-09-28 5 views
0

私は、単にprocess.start(MPC-HC.exe)を使って音楽ファイルのテキストファイルのリストを自動的に連続して再生するvb.netプログラムを持っています。リストが完成していない間に、ユーザがさらなる音楽の演奏を停止しない限り、すべてがうまくいく。process.startの使用後にメインプログラムを終了するにはどうしたらいいですか?

私は音楽をユーザーの介入なしで自動的に再生したいので、各選択がそれ自身で再生を終了した後に、プレーヤーを閉じるように指定する必要があります。これはコマンドラインスイッチ "/ play/close"で行うことができます。

どのようにします:

  1. は、使用するプレイヤーを指定します。
  2. は、私が使用し、コマンドラインが私の元のコードでは

を切り替えて追加 -

OpenWith = "C:\Program Files\mpc-hc\mpc-hc.exe" 
f = vbDoubleQuote + TextLine + vbDoubleQuote + " /play /close" 

がどのように私はプロセスでこれらの事を成し遂げるん

Dim startInfo As New ProcessStartInfo 
    startInfo.FileName = OpenWith 
    startInfo.Arguments = f 

?ここで

おかげで、

ラス

が示唆答えと更新vb.netコードです:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

    OpenFileDialog1.Title = "Please Select a File" 
    OpenFileDialog1.InitialDirectory = "C:\" 
    OpenFileDialog1.Filter = "Text Files|*.txt" 
    OpenFileDialog1.DefaultExt = "*.txt" 
    OpenFileDialog1.FileName = "*.txt" 
    OpenFileDialog1.ShowDialog() 

    If OpenFileDialog1.CheckFileExists Then 
     filePaths = New Queue(Of String)(File.ReadAllLines(OpenFileDialog1.FileName)) 

     'Execute the first file. 
     process = Process.Start(filePaths.Dequeue()) 
     Process.EnableRaisingEvents = True 
    End If 

End Sub 

Private Sub process_Exited(sender As Object, e As EventArgs) Handles process.Exited 
    If filePaths.Count = 0 Then 
     'No more files to execute. 
     Application.Exit() 
    Else 
     'Execute the next file. 
     Process = Process.Start(filePaths.Dequeue()) 
     Process.EnableRaisingEvents = True 
    End If 
End Sub 
+0

これは、あなたが '.WaitForExit()'を実行してUIスレッドをブロックしているためです。次のファイルに移動するタイミングを知るには、 'Exited'イベントに応答する必要があります。 – Enigmativity

+0

私は完全に理解していません - 私は.WaitForExit()を使用しているので、私はメインアプリケーションを終了できません。これは、音楽ファイルを一度に再生したり、開いているファイルが多すぎたりすることがないようにするために必要でした。私が「エグゼクティブイベント」にどのように反応するかについてさらに説明してください。 – Russ

+0

jmcilhinneyの答えは私が示唆しているものです。 – Enigmativity

答えて

6

は、ループを使用して、それにWaitForExitを呼び出さないでください。代わりに、Queueにアイテムを配置し、次のアイテムをデキューし、Process.Startと呼び出して、のExitedイベントを処理します。イベントハンドラでは、次の項目をデキューして再度同じ処理を行います。例えば。

Private WithEvents process As Process 
Private filePaths As Queue(Of String) 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    filePaths = New Queue(Of String)(File.ReadAllLines("source file path here")) 

    'Execute the first file. 
    process = Process.Start(filePaths.Dequeue()) 
    process.EnableRaisingEvents = True 
End Sub 

Private Sub process_Exited(sender As Object, e As EventArgs) Handles process.Exited 
    If filePaths.Count = 0 Then 
     'No more files to execute. 
     Application.Exit() 
    Else 
     'Execute the next file. 
     process = Process.Start(filePaths.Dequeue()) 
     process.EnableRaisingEvents = True 
    End If 
End Sub 
+0

最初のファイル(関連するプレーヤー "VLC.exe")のみを再生しました。さらなる音楽を演奏するためにprocess_Exitedを呼び出す必要がありますか? – Russ

+0

最初のファイル(関連するプレーヤー "VLC.exe")のみを再生しました。さらなる音楽を演奏するためにprocess_Exitedを呼び出す必要がありますか?また、VLCが1タイトルの後に異常な方法で終了するように要求しているというエラーを出しました。それは決して2番目をロードしませんでした。 MPC-HCを使用していたので、コマンドライン引数で各タイトルの開始/停止を許可しました。そのプレーヤーとデフォルトプレーヤーを強制的に使用するにはどうすればよいですか? – Russ

+0

'Process'オブジェクトは実際には' Exited'イベントを発生させていませんでした。コード例を修正して修正しました。 'EnableRaisingEvents'プロパティは新しい' Process'ごとに 'True'に設定されるようになりました。残りの質問は範囲外です。 – jmcilhinney

関連する問題