Войти

Показать полную графическую версию : как контролировать ход выполнения запущенного процесса


RUVATA
31-08-2010, 09:27
Всем доброго времени суток... smile
среда:Visual Studio 2010

Cитуация следующая:
Суть программы - производить архивирование и по хитрой своей логике раскладывать, рассылать эти в архивы, в зависимости от тех или иных условий, при этом совсем не исключено, что данные которые необходимо будет заархивировать в этот момент будут использоваться, в связи с чем (реакция на ошибку запущенного процесса) программе необходимо будет перейти к следующему архивированию, но в последствии попробовать еще несколько раз, в случае провала - запись в лог и.т. д

Для решения данной задачи... мне совсем не надо "кнопочной мишуры", потому - консольное приложение...
И всё вроде неплохо пока дело не доходит как раз до исключения, когда файлы уже используются

суть:
Я не делаю перенаправление ввода/вывода от запускаемых процессов 7zip... в главном окне консоли формируется отчет.
Запущенные процессы открываются отдельными консолями, при этом моя программа приспокойненько двигает дальше
(а я бы хотел, чтобы основная программа дождалась реакции запущенного ей процесса, как это сделать?)
для запуска процессов я использую конструкцию:


Dim zip7 As New Process
'7zip описан в ситст.PATH
zip7.StartInfo.FileName = "7z"
zip7.StartInfo.Arguments = "a -tzip " & "сформированное имя архива" & " " & "архивируемый каталог"
zip7.Start()


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

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

zip7.StartInfo.UseShellExecute = False
zip7.StartInfo.RedirectStandardInput = True
zip7.StartInfo.RedirectStandardOutput = False


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

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

Delirium
31-08-2010, 09:40
Надо смотреть функции Process. Вот пример вывода результата в текущее окно:
http://www.java2s.com/Code/CSharp/Development-Class/RedirectingProcessOutput.htm
http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspx

Пошуршите по поиску по такому критерию: http://www.google.ru/search?hl=ru&q=C%23+Process+output+to+file&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&lr=

RUVATA
31-08-2010, 11:52
как вообще юзать запущенные процессы... есть например у Process такое свойство:
Process.StandardError
'Получает поток, используемый для чтения вывода ошибок приложения
Есть у Process такой метод:
Process.StartInfo.RedirectStandardError
'Возвращает или задает значение, позволяющее определить, записываются ли выходные данные об ошибках в поток Process ..::.StandardError

вот как мне этот Process.StandardError запихнуть например в StremReader...

да и вообще где можно уму разуму набраться по потокам, где их, как ловить и т.д.

СУТЬ:
Объявляем объект - процесс
Объявляем объект - стрим-ридер
Об являем объект - поток (поток ошибок процесс)
Присваиваем процесс аргументы
Запускаем процесс
приостанавливаем ход до окончания процесс
получаем в стрим-редер - поток
обрабатываем их ... и от этого пляшем.

Admiral
31-08-2010, 14:00
RUVATA, в этом случаи рациональнее смотреть в сторону LZMA SDK (http://www.7-zip.org/sdk.html) и получать ответ об успешности операций компрессии непосредственно от соответственных функций.




© OSzone.net 2001-2012