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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Блокируються кнопки управления при процессе 
:(
    Опции темы
BoomeR
  Дата 28.8.2007, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



При исполнении кода :
Код

            Process trans = new Process();
            trans.StartInfo.FileName = FileBox.Text;
            trans.StartInfo.Arguments = ArgsBox.Text;
            trans.StartInfo.UseShellExecute = false;
            trans.StartInfo.RedirectStandardOutput = true;
            trans.StartInfo.CreateNoWindow = true;
            trans.Start();
            while (!trans.HasExited)                                                                                                      //<-------------
                ExecuteBox.AppendText (trans.StandardOutput.ReadLine() + Environment.NewLine); //<-------------
            trans.WaitForExit();


На указанном месте происходит "зависание" управляющих элементов, до момента полного выполнения вызванного консольного приложения. Как с этим бороться?
PM MAIL WWW ICQ Skype   Вверх
SpaceSpace
Дата 28.8.2007, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



делай это асинхронно

Добавлено через 1 минуту и 6 секунд
ты сам ждешь завершения
trans.WaitForExit(); <------------

поэтому всё и зависает


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
BoomeR
Дата 28.8.2007, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(SpaceSpace @  28.8.2007,  10:40 Найти цитируемый пост)
ты сам ждешь завершения
trans.WaitForExit(); <------------

поэтому всё и зависает 


Дело, к сожалению не в этом.

А на счёт асинхронности, можешь поподробнее объяснить  smile 
PM MAIL WWW ICQ Skype   Вверх
SpaceSpace
Дата 28.8.2007, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



попробуй так.
делаеш метод, в котором запускаеш процесс.
Код

public void AsyncThreadStart()
{ 
            Process trans = new Process();
            trans.StartInfo.FileName = FileBox.Text;
            trans.StartInfo.Arguments = ArgsBox.Text;
            trans.StartInfo.UseShellExecute = false;
            trans.StartInfo.RedirectStandardOutput = true;
            trans.StartInfo.CreateNoWindow = true;
            trans.Start();
            while (!trans.HasExited)                                                          
                ExecuteBox.AppendText (trans.StandardOutput.ReadLine() + Environment.NewLine); 
            trans.WaitForExit();

}


этот метод вызываеш асинхронно - в новом потоке.

Код

Thread t = new Thread(new ThreadStart(AsyncThreadStart()));
t.Start();



я понял в чем косяк.
что такое у тебя  ExecuteBox?

как я выше показывал может не работать, т.к.
будет кросс-потоковое сообщение, т.е. ресурс ExecuteBox,
который ты меняеш - находится в одном, а меняющий его процесс в другом потоке


Это сообщение отредактировал(а) SpaceSpace - 28.8.2007, 14:04


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
BoomeR
Дата 28.8.2007, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



SpaceSpace, да иммено на этом компилятор и ругаеться :( А что делать?
PM MAIL WWW ICQ Skype   Вверх
SpaceSpace
Дата 28.8.2007, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



это можно обойти.
для начала покажи что такое ExecuteBox.

я дам пример для этого.
придется сделать событие, подписаться на него.
и в обработчике менять ExecuteBox
через Invoke 


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
BoomeR
Дата 28.8.2007, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

    partial class CMD_RUNNER
    {
        ...
        private void InitializeComponent()
        {
           ...
            // 
            // ExecuteBox
            // 
            this.ExecuteBox.Location = new System.Drawing.Point(12, 12);
            this.ExecuteBox.Multiline = true;
            this.ExecuteBox.Name = "ExecuteBox";
            this.ExecuteBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
            this.ExecuteBox.Size = new System.Drawing.Size(368, 204);
            this.ExecuteBox.TabIndex = 1;
            ...
          }
        ...
        private System.Windows.Forms.TextBox ExecuteBox;
    }


Собственно вот
PM MAIL WWW ICQ Skype   Вверх
SpaceSpace
Дата 28.8.2007, 14:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



в принципе мне нужно знать только тип, хотя можно было и обойтись.

можно немного модифить код.
во превых,
поместим в отдельный метод  , который обращается к ресурсу
в другом потоке.
обжект параметр - результат trans.StandardOutput.ReadLine()
Код

public void AsyncChange(object param)
{ 
if (this.InvokeRequired)
{
ParameterizedThreadStart updateStatus = new  ParameterizedThreadStart(AsyncChange);
this.Invoke(updateStatus, new object[] {param});
}
else
{
      ExecuteBox.AppendText ((string)param + Environment.NewLine); 
}
}


делаеш метод, в котором запускаеш процесс.

Код

 public void AsyncThreadStart()
{ 
            Process trans = new Process();
            trans.StartInfo.FileName = FileBox.Text;
            trans.StartInfo.Arguments = ArgsBox.Text;
            trans.StartInfo.UseShellExecute = false;
            trans.StartInfo.RedirectStandardOutput = true;
            trans.StartInfo.CreateNoWindow = true;
            trans.Start();
            while (!trans.HasExited)                                                     
                AsyncChange(trans.StandardOutput.ReadLine() );
            trans.WaitForExit();

}


этот метод вызываеш асинхронно - в новом потоке.

Код

 Thread t = new Thread(new ThreadStart(AsyncThreadStart()));
t.Start();


ну если заработает, ставь плюс, не стесняйся  smile 
 
 




--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
BoomeR
Дата 28.8.2007, 14:40 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



SpaceSpace, 
Заработало, спасибо, но к сожалению плюсов пока давать не могу  smile 
PM MAIL WWW ICQ Skype   Вверх
SpaceSpace
Дата 28.8.2007, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ну...
без плюса, значит без плюса.
не плюсом единым жив программер smile 


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




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


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

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