Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2016, 09:18   #1
DiligeNT
Новичок
Джуниор
 
Регистрация: 17.06.2016
Сообщений: 5
Печаль ProgressBar для установки программы в тихом режиме

Привет всем! Нужна помощь! Уже всё перепробовал, толком ничего не нашел.
Смысл такой: Мне нужно вывести процесс установки программ на ProgressBar, которые устанавливается в тихом режиме.
После нажатия кнопки устанавливаются 2 программы в тихом (скрытом режиме), но при этом вся форма повисает от WaitForExit(); и не могу отобразить какой-либо процесс.
Нужно получить от программ % выполнения чтоли или как я даже не пойму.
1я программа устанавливается довольно быстро, примерно 1 минута, 2я же ставится около 10-30 минут, при этом отобразить какой то процесс не могу. Тупо повисает окно и отвисает только после установки этих приложений.
Помогите, будьте любезны


Нажимаю кнопку, запускается установка программ:

Код:
                Process qwe1 = new Process();
                qwe1.StartInfo.FileName =           @"C:\PI_SYSTEM\OSIprereqs_standalone_2.0.0.10\Setup.exe";
                qwe1.StartInfo.Arguments = @" -f PRQS.ini";
                qwe1.Start();
                qwe1.WaitForExit();
                qwe1.Close();
                Process qwe2 = new Process();
                qwe2.StartInfo.FileName = @"C:\PI_SYSTEM\PIActiveView_2012_SP2\Setup.exe";
                qwe2.StartInfo.Arguments = @" -f ACTW.ini";
                qwe2.Start();
                qwe2.WaitForExit();
                qwe2.Close();

Последний раз редактировалось Alex11223; 17.06.2016 в 11:14.
DiligeNT вне форума Ответить с цитированием
Старый 17.06.2016, 09:39   #2
max_prorok
Форумчанин
 
Регистрация: 06.10.2011
Сообщений: 181
По умолчанию

Не пробовал использовать BackgroundWorker?
Форма подвисать по идее не должна, и можно возвращать значение.
max_prorok вне форума Ответить с цитированием
Старый 17.06.2016, 09:50   #3
DiligeNT
Новичок
Джуниор
 
Регистрация: 17.06.2016
Сообщений: 5
По умолчанию

Цитата:
Сообщение от max_prorok Посмотреть сообщение
Не пробовал использовать BackgroundWorker?
Форма подвисать по идее не должна, и можно возвращать значение.
Пробовал но видимо не совсем правильно или не так. Пробовал, прогресс шел, но сам по себе как то. не смог привязать к процессу установки софта.
DiligeNT вне форума Ответить с цитированием
Старый 17.06.2016, 10:17   #4
max_prorok
Форумчанин
 
Регистрация: 06.10.2011
Сообщений: 181
По умолчанию

Есть у меня подозрения, что вы сможете поставить только 3 точки для прогрессбара: первая - старт установки первой программы; вторая - конец установки первой, старт установки второй; третий - конец установки второй программы.
Честно сказать, как-то мало точек для прогрессбара. Но если вы сможете вытащить процесс установки каждой программы, то наверняка можно и увеличить количество точек.
max_prorok вне форума Ответить с цитированием
Старый 17.06.2016, 10:26   #5
DiligeNT
Новичок
Джуниор
 
Регистрация: 17.06.2016
Сообщений: 5
По умолчанию

Цитата:
Сообщение от max_prorok Посмотреть сообщение
Есть у меня подозрения, что вы сможете поставить только 3 точки для прогрессбара: первая - старт установки первой программы; вторая - конец установки первой, старт установки второй; третий - конец установки второй программы.
Честно сказать, как-то мало точек для прогрессбара. Но если вы сможете вытащить процесс установки каждой программы, то наверняка можно и увеличить количество точек.
Да я вот тоже думаю , что такое событие не отследить толком. Тем более в тех софтах зашиты еще софты, т.е. во 2й программе к примеру внутри еще есть 15 программ и ставятся они комплексом. Проще мне кажется сделать типа:

Process qwe1 = new Process();
qwe1.StartInfo.FileName = @"C:\PI_SYSTEM\OSIprereqs_standalon e_2.0.0.10\Setup.exe";
qwe1.StartInfo.Arguments = @" -f PRQS.ini";
qwe1.Start();
qwe1.WaitForExit();
qwe1.Close();
progressBar1.Value = 35;
Process qwe2 = new Process();
qwe2.StartInfo.FileName = @"C:\PI_SYSTEM\PIActiveView_2012_SP 2\Setup.exe";
qwe2.StartInfo.Arguments = @" -f ACTW.ini";
qwe2.Start();
qwe2.WaitForExit();
qwe2.Close();
progressBar1.Value = 100;

Просто сделать значение для бара после установки на 35 после 1й установки к примеру и на 100 после 2й. Просто при установки софта пользователем, он не поймет, что форма зависла и ничего не происходит, хотя по факту установка идти будет.
DiligeNT вне форума Ответить с цитированием
Старый 17.06.2016, 10:50   #6
max_prorok
Форумчанин
 
Регистрация: 06.10.2011
Сообщений: 181
По умолчанию

Цитата:
Сообщение от DiligeNT Посмотреть сообщение
Просто при установки софта пользователем, он не поймет, что форма зависла и ничего не происходит, хотя по факту установка идти будет.
Я бы все-таки сделал через BackgroundWorker. Установку хотя бы свернуть можно будет...
max_prorok вне форума Ответить с цитированием
Старый 17.06.2016, 11:03   #7
DiligeNT
Новичок
Джуниор
 
Регистрация: 17.06.2016
Сообщений: 5
По умолчанию

Цитата:
Сообщение от max_prorok Посмотреть сообщение
Я бы все-таки сделал через BackgroundWorker. Установку хотя бы свернуть можно будет...
Приведи похожий пример, буду благодарен.
DiligeNT вне форума Ответить с цитированием
Старый 17.06.2016, 11:18   #8
max_prorok
Форумчанин
 
Регистрация: 06.10.2011
Сообщений: 181
По умолчанию

Цитата:
Сообщение от DiligeNT Посмотреть сообщение
Приведи похожий пример, буду благодарен.
Добавляешь на форму из Панели элементов -> Компоненты -> BackgroundWorker. Устанавливаешь в свойствах WorkerReportsProgress и WorkerSupportsCancellation в true. И добавляешь обработчики событий всех. Код ниже. в методе private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) вместо цикла вставляешь свой код, но с сохранением worker.ReportProgress(i * 10); Здесь у тебя записывается значение, которое потом передается в прогрессбар. Допустим в самом начале в скобках у тебя 0, потом 35 и в конце 100.
Код:
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (!backgroundWorker1.IsBusy)
                backgroundWorker1.RunWorkerAsync();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.WorkerSupportsCancellation == true)
            {
                // Cancel the asynchronous operation.
                backgroundWorker1.CancelAsync();
            }
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            for (int i = 1; i <= 10; i++)
            {
                if (worker.CancellationPending == true)
                {
                    e.Cancel = true;
                    break;
                }
                else
                {
                    // Perform a time consuming operation and report progress.
                    System.Threading.Thread.Sleep(500);
                    worker.ReportProgress(i * 10);
                }
            }
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = (e.ProgressPercentage);
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled == true)
            {
                label1.Text = "Canceled!";
            }
            else if (e.Error != null)
            {
                label1.Text = "Error: " + e.Error.Message;
            }
            else
            {
                label1.Text = "Done!";
            }
        }
    }
P.S. Ссылка на MSDN (код практически оттуда, с небольшой доработкой) - BackgroundWorker.
max_prorok вне форума Ответить с цитированием
Старый 17.06.2016, 11:22   #9
max_prorok
Форумчанин
 
Регистрация: 06.10.2011
Сообщений: 181
По умолчанию

WorkerSupportsCancellation это для отмены. Если не надо, то и не надо его в true ставить. Но тогда соответственно и дальше тоже поправлять надо будет код.
max_prorok вне форума Ответить с цитированием
Старый 17.06.2016, 11:23   #10
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Если они выводят прогресс в консоль, то можно получать и парсить текст для более детального определения прогресса.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Исходник программы для установки обновлений Dux Общие вопросы Delphi 16 26.05.2014 18:02
Сбой программы установки nvidia Lays Kaelsky Операционные системы общие вопросы 4 08.05.2014 15:02
регистрация осуществляемая только на раз с момента установки программы m1zantrop Общие вопросы Delphi 1 08.06.2012 12:18
Запуск программы в скрытом режиме. pr0n1x C# (си шарп) 0 19.05.2011 03:19
какие есть программы для автоматической установки компонентов TotKtoNado Компоненты Delphi 4 13.02.2011 19:36