单声道中的非托管进程

时间:2010-04-27 20:08:52

标签: c# linux multithreading process mono

我想创建一个Mono应用程序来启动和停止多个进程。我只需要能够从Mono应用程序启动和停止进程,我不需要任何托管进程的高级功能。用户将能够从“首选项”菜单中自定义可用的进程。

问题是,我还需要能够创建一个IdleHandler,但是处理程序不会触发,因为应用程序永远不能,由于进程,GUI(GTK#)因为没有响应而没有响应过程的重量。有没有办法从Mono开始和停止完全不受管理的进程?

无法降低进程的优先级,因为这会导致音频丢失。

以下是我尝试制作的应用程序的基本说明:http://ix.residuum.org/monomultijack.html

4 个答案:

答案 0 :(得分:1)

你能不能只触发启动jackd的init.d脚本? (只是假设有一个init.d脚本,因为我们正在谈论一个守护进程)

如果没有这样的剧本,你能不能制作一个剧本吗?守护进程在后台启动,因此您将要启动的进程是运行脚本的bash-process,然后在后台启动守护进程时退出。

停止会以同样的方式运作。

答案 1 :(得分:0)

编辑:基本问题似乎是,当机器非空闲时,您正在等待空闲甚至被提升。 documentation说:

  

空闲处理程序的另一个用途是   队列工作要在机器上完成   怠速,没有做任何事情   有趣。

它没有明确说明当你的应用程序空闲而另一个应用程序正在使用CPU时会发生什么,但上面的句子听起来好像处理程序可能不会触发,除非整个机器空闲,而不仅仅是你的应用程序。所以你所看到的行为很可能是设计出来的。

原始回答:

我不太确定你的问题是什么。您试图解决的基本问题是什么?

如果问题是该进程占用了所有CPU,您可以优先考虑它:_jackd.PriorityClass = ProcessPriorityClass.BelowNormal

如果你改进了问题,我可以改进答案。 :)

答案 2 :(得分:0)

你的问题没有多大意义。如果您想要启动另一个进程,然后在用户单击按钮时将其终止,您只需创建进程并运行它:

private Process _jackd;

public void StartJackd() 
{ 
    _jackd = new Process (); 
    _jackd.StartInfo = _jackdStartup; 
    _jackd.Start (); // Non-blocking
} 

然后,如果你想阻止它:

_jackd.CloseMainWindow();

or

_jackd.Kill();

如果您的应用程序终止它有点慢,那么您也可以将应用程序的优先级提高到高。

如果这不是您想要的,我建议您更详细地解释您想要做的事情。

答案 3 :(得分:0)

我想猜测你问题的确切含义。

你是说你有一组你在应用程序中启动的进程,其中一些是idelhandler(即当应用程序什么都不做时你会触发的进程),而且idlehandler永远不会被解雇,因为其他进程是总是跑?

我对空闲处理程序的理解是,当gtk应用程序循环没有更多要处理的事件时,它才会被触发。如果要启动其他系统进程(即jackd),则不应影响主应用程序循环(因为这些进程在系统级别上运行而不在应用程序中)。

您是否可能在主应用程序中有任何方法会不断发射? (例如每秒触发一次的事件监听器)

如果是这样,是否可以将这些事件抽象到一个单独的进程中,然后只在需要进行更新时才通知主应用程序?然后,这应该允许触发idel处理程序。

另一种可能的解决方案是你可以使用超时方法而不是空闲处理程序。如果有需要频繁发射的功能(比如每10ms左右),那么超时处理程序可能更适合。

遗憾的是,如果没有关于您正在运行的流程以及您尝试使用空闲处理程序处理的内容的更多信息,可能很难给出确切的答案。