代码之家  ›  专栏  ›  技术社区  ›  Residuum

Mono中的非托管进程

  •  -1
  • Residuum  · 技术社区  · 14 年前

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

    问题是,我还需要能够创建一个空闲的处理程序,但该处理程序将不会启动,因为应用程序由于进程而永远无法启动,并且由于进程的重量,GUI(GTK)将变得无响应。有没有办法从mono启动和停止完全非托管的进程?

    降低进程的优先级是不可能的,因为这将导致音频中断。

    下面是我试图提出的应用程序的基本描述: http://ix.residuum.org/monomultijack.html

    4 回复  |  直到 14 年前
        1
  •  1
  •   Christian Wattengård    14 年前

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

    如果没有这样的剧本,你能不能做一个?守护进程在后台启动,所以您要启动的进程是运行脚本的bash进程,然后在后台启动守护进程时退出。

    停下来也一样。

        2
  •  0
  •   NibblyPig    14 年前

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

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

    如果你想阻止它:

    _jackd.CloseMainWindow();
    
    or
    
    _jackd.Kill();
    

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

    如果这不是你想要的,我建议你更详细地解释一下你想做什么。

        3
  •  0
  •   Didius    14 年前

    我想知道你问题的确切意思。

    你是说你有一组你在应用程序中启动的进程,其中一些是Idelhandler(即当应用程序不做任何事情时你启动的进程),而IdleHandler永远不会被触发,因为其他进程总是在运行?

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

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

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

    另一个可能的解决方案是可以使用超时方法而不是idleHandler。如果有一些函数需要频繁地触发(比如说每10毫秒左右),那么超时处理程序无论如何可能更适合。

    遗憾的是,如果没有关于您正在运行的进程以及您试图使用idleHandlers处理的进程的详细信息,可能很难给出准确的答案。

        4
  •  0
  •   EMP    14 年前

    编辑: 最基本的问题似乎是你在等待一个闲置的机器,甚至当机器 不闲置 . 这个 documentation 说:

    空闲处理程序的另一个用途是 当机器 空转,什么都不做 有趣。

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

    原始答案:

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

    如果问题是进程占用了所有CPU,您可以给它一个较低的优先级: _jackd.PriorityClass = ProcessPriorityClass.BelowNormal

    如果你改进这个问题,我也许能改进答案。:)