Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Асинхронный вывод из консоли. Как хитро асинхронно выводить строки? 
:(
    Опции темы
Keannad
  Дата 25.2.2008, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 15.11.2006

Репутация: нет
Всего: нет



У меня есть программа... Небольшая оболочка для консольного рара, которая запускает его с выбранными параметрами (сводит процесс архивирования до нескольких кликов и параметры как бы являются эталонными...).

Так вот запускаю "rar.exe" через "Process" в отдельном потоке (чтоб не вешало форму) с перенаправлением консольного вывода в программу на C#. Мне нормально приходят строки "добавление файла", информация", но когда дело доходит до бегущих  процентов - мне возвращается строка типа "добавлени ... /b/b/b/b 0% /b/b/b/b 5% ...." И так далее, и получаю я её когда архивирование собственно закончилось...

Можно как либо вывести эту строчку на на форму чтоб проценты бежали? Или уже никак?
PM MAIL   Вверх
Yama
Дата 29.2.2008, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 2.8.2006

Репутация: 2
Всего: 2



Делаешь синхронизацию с твоей формой, StreamReader'ом вычитываешь строки и после этого выводишь их в нужный тебе контрол.
--------------------
Если бы строители строили дома так же, как программисты пишут программы, то первый же залетевший в форточку дятел разрушил бы всю нашу цивилизацию.
PM MAIL   Вверх
Keannad
Дата 1.3.2008, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 15.11.2006

Репутация: нет
Всего: нет



Ты имеешь в виду это?
Код

stdoutreader = procces.StandardOutput;
Encoding windows1251 = Encoding.GetEncoding("windows-1251");
while ((stdoutline = stdoutreader.ReadLine()) != null)
 {
//мой код
}


Повторюсь... Строка возвращается типа "добавлени ... /b/b/b/b 0% /b/b/b/b 5% ...." И так далее, и получаю я её когда архивирование собственно закончилось...

Это сообщение отредактировал(а) Keannad - 1.3.2008, 13:26
PM MAIL   Вверх
WERITAS
Дата 1.3.2008, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 2.5.2005
Где: Москва

Репутация: нет
Всего: 5



Доброго времени суток. Можно попробовать как-нибудь так
Код

FileStream fs = new FileStream(....);
byte[] mass = new byte[fs.length];
.......................
IAsyncResult arg = fs.BeginRead(mass, 0, mass.Length, null, null);
while(!arg.IsCompleted)
{
Console.WriteLine("Work in progress!"); // Во время чтения файла будет выводиться "Work in progress!"
..............
}

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


--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
Keannad
Дата 2.3.2008, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 15.11.2006

Репутация: нет
Всего: нет



Весь код процедуры выполняемый вторым потоком...

Код

        private void BW1_DoWork(object sender, DoWorkEventArgs e)
        {
            Winrar options = (Winrar)e.Argument;
            Process procces = null;
            ProcessStartInfo processinfo;
            OperatingSystem os;
            string command, stdoutline;
            StreamReader stdoutreader;
            Encoding utf8 = Encoding.GetEncoding("utf-8");
            command = options.CreateString() + options.GetFileWithInfo;
            try
            {
                os = Environment.OSVersion;
                if (os.Platform != PlatformID.Win32NT)
                {
                    os = null;
                    throw new PlatformNotSupportedException("Требуется Windows NT или выше");
                }
                if (command == null || command.Trim().Length == 0)
                {
                    throw new ArgumentNullException("command");
                }
                processinfo = new ProcessStartInfo();
                processinfo.FileName = options.GetRarPath;
                processinfo.Arguments = command;
                processinfo.UseShellExecute = false;
                processinfo.RedirectStandardOutput = true;
                processinfo.CreateNoWindow = true;
                procces = Process.Start(processinfo);
                stdoutreader = procces.StandardOutput;
                Encoding windows1251 = Encoding.GetEncoding("windows-1251");
                while ((stdoutline = stdoutreader.ReadLine()) != null)
                {
                    byte[] srcByte = windows1251.GetBytes(stdoutline);
                    string temp = windows1251.GetString(Encoding.Convert(Encoding.GetEncoding("cp866"), windows1251, srcByte));
                 // здесь сторка должна выводиться в какой либо контрол...
                }
                BW1.ReportProgress(100);
                stdoutreader.Close();
                stdoutreader = null;
            }
            catch
            {
                throw;
            }
            finally
            {
                if (procces != null)
                {
                    procces.Close();
                }
                procces = null;
                processinfo = null;
            }
            e.Result = 0;
        }

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0574 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.