Неуправляемый процесс в моно - PullRequest
0 голосов
/ 28 апреля 2010

Я хочу создать приложение Mono для запуска и остановки нескольких процессов. Мне нужно только иметь возможность запускать и останавливать процессы из приложения Mono, мне не нужны никакие расширенные функции управляемых процессов. Пользователи смогут настраивать доступные процессы из меню «Настройки».

Проблема в том, что мне также нужно иметь возможность создавать IdleHandler, но обработчик не будет запускаться, потому что приложение никогда не сможет из-за процессов, а GUI (GTK #) перестает отвечать из-за вес процессов. Есть ли способ запустить и остановить полностью неуправляемые процессы из Mono?

Понижение приоритета процессов невозможно, так как это приведет к пропаданию звука.

Вот базовое описание приложения, которое я пытаюсь сделать: http://ix.residuum.org/monomultijack.html

Ответы [ 4 ]

1 голос
/ 05 мая 2010

Не могли бы вы просто запустить скрипт init.d, который запускает jackd? (Просто предполагая, что существует скрипт init.d, поскольку мы говорим о демоне)

Если такого сценария нет, не могли бы вы его создать? Демон запускается в фоновом режиме, поэтому вы должны запустить bash-процесс, который запускает скрипт, который затем завершается при запуске демона в фоновом режиме.

Остановка будет работать так же.

0 голосов
/ 09 мая 2010

Я пытаюсь угадать точное значение вашего вопроса.

Вы говорите, что у вас есть группа процессов, которую вы запускаете в приложении, некоторые из которых являются idelhandlers (то есть процессом, который вы запускаете, когда приложение ничего не делает), и idlehandlers никогда не запускаются, потому что другие процессы всегда работает?

Я понимаю, что обработчик бездействия состоит в том, что он будет запущен только тогда, когда в цикле приложения gtk больше нет событий для обработки. Если вы запускаете другой системный процесс (например, jackd), он не должен влиять на основной цикл приложения (так как эти процессы выполняются на системном уровне, а не в приложении).

Возможно ли, что у вас есть какой-то метод в основном приложении, который бы постоянно стрелял? (например, прослушиватель событий, который срабатывает каждую секунду)

Если это так, можно ли абстрагировать эти события в отдельный процесс, и только затем уведомлять основное приложение о необходимости обновления? Это должно затем позволить обработчикам idel быть запущенными.

Другое возможное решение - вы могли бы использовать методы тайм-аута вместо бездействующих. Если есть функции, которые вам нужно запускать чаще (скажем, каждые 10 мс или около того), тогда обработчик тайм-аута может быть лучше в любом случае.

К сожалению, без дополнительной информации о том, какие именно процессы вы выполняете и что вы пытаетесь обработать с помощью простоя, может быть трудно дать вам точный ответ.

0 голосов
/ 07 мая 2010

Ваш вопрос не имеет большого смысла. Если вы хотите запустить другой процесс, а затем убить его, когда пользователь нажимает кнопку, вы просто создадите свой процесс и запустите его:

private Process _jackd;

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

Тогда, если вы хотите остановить это:

_jackd.CloseMainWindow();

or

_jackd.Kill();

Если ваше приложение немного медлительно завершает его, то вы также можете повысить приоритет своего приложения до высокого.

Если это не то, что вы ищете, я бы предложил более подробно объяснить, что вы пытаетесь сделать.

0 голосов
/ 05 мая 2010

Редактировать: Кажется, основная проблема в том, что вы ожидаете, когда простоя даже поднимется, когда машина не простаивает . документация гласит:

Другое использование обработчика простоя - это работа в очереди, которую нужно выполнить, когда машина бездельничает и ничего не делает интересно.

В нем явно не говорится о том, что происходит, когда ваше приложение бездействует, а другое приложение использует процессор, но приведенное выше предложение звучит так, как будто обработчик может не сработать, если не работает весь компьютер, а не только ваше приложение. Так что поведение, которое вы видите, вполне может быть умышленным.

Оригинальный ответ:

Я не совсем уверен, какой у вас вопрос. Какую основную проблему вы пытаетесь решить?

Если проблема в том, что процесс занимает все ЦП, вы можете придать ему более низкий приоритет: _jackd.PriorityClass = ProcessPriorityClass.BelowNormal

Если вы улучшите вопрос, я смогу улучшить ответ. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...