Кто заставляет засыпать мой процесс?
От: PDmitry Россия  
Дата: 18.04.06 08:52
Оценка:
Я пишу ASP.net приложение, которое принимает мультимедиа файлы конвертирует и отправляет обратно клиенту.
Использую для конвертации утилиту которую запускаю из коммандной строки. Запускаю примерно так:


ProcessStartInfo startInfo = new ProcessStartInfo("ffmpeg.exe","-i 1.avi -y -b 360 -r 25 -s 320x200 -deinterlace -ab 56 -ar 22050 -ac 1 \"2.flv\" ");
startInfo.RedirectStandardError = true;

startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardInput = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
            
Process process = Process.Start(startInfo);
process.PriorityClass = ProcessPriorityClass.Normal;
Console.WriteLine(process.StandardOutput.ReadToEnd());
process.WaitForExit();


Проблема в том что конвертация идет хорошо только первые 20 секунд потом процесс замирает, это значит что кушал 50 % процессорного времени а потом бац и в ноль ушел.

Проблема не в настройках ASP.net потому что смастерив простое консольное приложение получил тот же самый результат. Если убить мое консольное приложение то ffmpeg.exe не убивается и продолжает работать но только теперь оно нормально работаек кушает как и положение 50%.

Полагаю это .NET 'глушит' мой процесс, но где это отключить не представляю.
Re: Кто заставляет засыпать мой процесс?
От: AlexZu Россия  
Дата: 19.04.06 12:47
Оценка: 3 (1)
Здравствуйте, PDmitry, Вы писали:

PD>
PD>ProcessStartInfo startInfo = new ProcessStartInfo("ffmpeg.exe","-i 1.avi -y -b 360 -r 25 -s 320x200 -deinterlace -ab 56 -ar 22050 -ac 1 \"2.flv\" ");
PD>startInfo.RedirectStandardError = true;

PD>startInfo.RedirectStandardOutput = true;
PD>startInfo.RedirectStandardInput = true;
PD>startInfo.UseShellExecute = false;
PD>startInfo.CreateNoWindow = true;
            
PD>Process process = Process.Start(startInfo);
PD>process.PriorityClass = ProcessPriorityClass.Normal;
PD>Console.WriteLine(process.StandardOutput.ReadToEnd());
PD>process.WaitForExit();
PD>


Ключевое выделенно. Раз вы указали, что необходимо перенаправлять поток ошибок, то вы обязаны читать из этого потока,
поскольку пишущий в поток ошибок дочерний процесс будет заблокирован при заполнении буфера потока ошибок пока вы не прочитаете его.
Причем при перенаправлении более одного потока чтение необходимо производить в отдельных нитях (thread) для каждого потока,
дабы избежать блокировок.

Еще раз почитайте ремарку к ProcessStartInfo.RedirectStandardError.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.