如何在Mac上使用的Process.Start或同等使用Mono和传递参数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Mac上使用的Process.Start或同等使用Mono和传递参数相关的知识,希望对你有一定的参考价值。
参考技术A 如果我给NeMaC的参数不同,用上述指令会列出所有NeMaC命令执行的信息但是我只想获取其中ture command为还是得到了两个PID值,因为我同时使用了两个NeMaC命令(在不同命令窗口输入)一条是NeMaC -c 30 -m 25000 -r rules.sample 202.101.0.1 private rule1 一条是NeMaC -c 120 -m 25000 -r cs2.rules 202.101.0.1 private rule2 谢谢,另外,NeMaC是NeTraMet这个分析流的工具的一个组件。学习中分成两个脚本执行.请教中,如何用两脚本,要是对应NeMaC有N个进程呢?那又该如何是好换一个思路吧,我如何能得到一个进程的唯一子进程的pid?:?用 ps -C NeMaC -f | grep rule1 | awk 'print $2' 我已经能拿到想要kill的进程的pid了,其值例如为:12815 但是当我执行如下shell文件时确出错了 #!/bin/bash#PATH="$PATH":/home/gwei/myCode#myNeMaC=`ps -C NeMaC -f | grep myNeMaC1 | awk 'print $2'` kill -9 $myNeMaC它显示出来的错误信息是 : arguments must be process or job IDskill: 12815 kill -9 $myNeMaC 也可以杀掉进程,但是把上面这些写入一个.sh文件再执行就出错了怎麼办呢?移植到RH9後提示的错误信息是: [root@gxnunc0504 myCode]# /bin/bash ./killNeMaC1.sh : no such pidsh: line 6: kill: 21820 kill -9 $myNeMaC 上面就是我杀掉进程的教本killNeMaC1,其中echo $myNeMaC确认只剩下一个PID了,可是为什麼到了kill -9 $myNeMaC就运行不下去了呢。相关操作和结果如下:使用 process.start 后如何退出主程序?
【中文标题】使用 process.start 后如何退出主程序?【英文标题】:how do I exit the main program after using process.start? 【发布时间】:2016-09-28 13:56:32 【问题描述】:我有一个有效的 vb.net 程序,它简单地使用 process.start(MPC-HC.exe)
自动按顺序播放音乐文件的文本文件列表。一切都很好,除非用户希望在列表未完成时停止播放任何进一步的音乐。
按照建议更新代码后仍有 1 个问题: 因为我希望音乐在没有用户干预的情况下自动播放 - 我需要在每个选择自行完成播放后指定播放器关闭。这可以通过命令行开关“/play /close”来完成。
我该怎么做:
-
指定要使用的播放器。
添加命令行开关
在我的原始代码中,我使用了 -
Dim startInfo As New ProcessStartInfo
startInfo.FileName = OpenWith
startInfo.Arguments = f
在哪里
OpenWith = "C:\Program Files\mpc-hc\mpc-hc.exe"
f = vbDoubleQuote + TextLine + vbDoubleQuote + " /play /close"
我如何通过流程完成这些事情?
谢谢,
罗斯
这是更新后的 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
【问题讨论】:
这是因为您通过执行.WaitForExit()
阻塞了 UI 线程。您需要响应Exited
事件才能知道何时移动到下一个文件。
我不完全理解 - 需要明确的是,我无法退出主应用程序,因为我正在使用 .WaitForExit()?正如所写,这对于不能一次播放所有音乐文件和打开太多文件是必要的。请进一步解释我如何“响应退出事件”。
jmcilhinney 的回答就是我的建议。
【参考方案1】:
不要使用循环并在其中调用WaitForExit
。相反,将项目放在Queue
中,使下一个项目出列,调用Process.Start
,然后处理Process
的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
【讨论】:
它只播放了第一个文件(带有关联的播放器“VLC.exe”)。我需要调用 process_Exited 来播放更多音乐吗? 它只播放了第一个文件(带有关联的播放器“VLC.exe”)。我需要调用 process_Exited 来播放更多音乐吗?它还给出了一个错误,说 VLC 要求在 1 标题后以不寻常的方式终止。它从未加载过第二个。我使用的是 MPC-HC,因为它允许我通过命令行参数启动/停止每个标题。我如何强制使用该播放器与默认播放器? 事实上,Process
对象实际上并没有引发Exited
事件。我已经调整了我的代码示例来解决这个问题。对于每个新的 Process
,EnableRaisingEvents
属性现在设置为 True
。您的其他问题超出了范围。
好的,它仍然只播放一首歌曲并停止。回到我原来的问题,我试图退出主程序,而 VLC 播放器正在运行第一个文件。我无法使用常规方式关闭它。
我怀疑你做错了什么,但没有看到你的代码就不可能说出来。您应该使用新代码和任何其他相关的新信息更新您的问题。以上是关于如何在Mac上使用的Process.Start或同等使用Mono和传递参数的主要内容,如果未能解决你的问题,请参考以下文章
Process.Start() 在 Windows 7 上立即退出
如何从 .NET 程序打开 Web 浏览器? Process.Start() 不起作用?
.Net Core 命令行应用程序 | Process.Start() 在某些机器上运行,但在其他机器上不运行