Как управлять консольным приложением из C# WinForms?
Пишу GUI для майнера, что бы было удобно запускать его с разными опциями.
Не очень понятно как запустить сам процесс так что бы:
-окно появилось
-его можно было скрывать
-текст в окне выводился как обычно
-текст из окна можно было парсить в GUI-программе (отслеживать хешрейт)
честно нагуглил про Process.Start() и его RedirectStandartOutput. Но это не то, потому что лаунчер останавливается, пока не завершится запущеный процесс и окно консоли в итоге пустое получается, весь вывод идет мимо.
ненене. майнер это такая штука, которая вычисляет кучи данных по особым алгоритмам, так что сам я его не напишу, я хочу правлять готовым (консольным) через GUI, потому что создавать кучу ярлыков с разными параметрами запуска надоело)
Запускаете процесс и подключаетесь к выводу. В мсдн по Process есть примеры. И делать это не обязательно в одном потоке, тогда и GUI замирать не будет.
а можно подробнее, если Вы вкурсе. тоже тут покопался в msdn, нашел BeginOutputReadline. типа асинхронного чтения. в сам Process передается делегат, который вроде как должен читать данные асинхронно.
но я переписал все и в итоге, GUI не замирает, но никаких данных нет. И в консоли пусто. И делегат срабатывает только когда закрываешь консоль, да и то данные = null.
Dmitry Butenko: нубский вопрос наверное, но я не силен в многопоточности. как я в итоге понял, процесс надо создавать в отдельном потоке, а как? вот у меня код в классе формы лежит, процесс создаю при клике по кнопке, а какой код и как вынести в поток и как из потока потом передавать данные в функцию в классе формы, что бы обновить GUI?
в объекте форма будет переменная-поток. поток запускает процесс, подключается к выводу - перенаправляет его в контрол формы. stdout также можно читать асинхронно (вроде по ссылке как раз есть пример на подписывание к событию). Тогда все еще проще, нужно просто по событию добавить текст к контролу логов. А так не удивлюсь, если контролу достаточно указать откуда брать данные (stdout процесса), а читает/добавляет он их сам.
асинхронный способ чтения не работает. я так понял что есть методы полного чтения за раз всего буфера, а есть такие вот асинхронные, когда можно построчно читать, но все они должны походу в потоке работать. или я что-то не то делаю. нигде нет конкретных реализаций, только абстрактные снипеты блин или примеры где читаецо весь буфер целиком