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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> многопоточность и Form 
:(
    Опции темы
Jagerntr
Дата 11.9.2008, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



добрый день. Ситуация следущая:

1) в приложении создается поток thread, в котором создается объект frmProgress класса Form. В этом классе есть функция ChangeProgress, принимающая параметр, производный от EventsArgs, и меняющая значение компонентов формы frmProgress в зависимости от параметра. 
2) в созданном потоке thread  обрабатываются объекты, которые возбуждают событие ProgressEvent с параметром выше указанным. На это событие подписан объект frmProgress.


Проблема в том, что если поток создается внутри класса, отнаследованного от Form, то делаю Invoke на отображение формы, а в обработчике события, на которое подписана созданная в потоке форма, делаю Invoke фукнции изменения состояния этой формы. Все работает.

А как сделать, чтобы форма, созданная в потоке, отобразилась на экране и изменяла свое состояние, если поток создается в классе, не наследующем Form? Чем заменить вызов Control.Invoke в приведенном коде, если MainClass не будет наследоваться от Control?

Код

//если MainClass : Form, то все работает нормально, а если нет, то, естественно, Invoke не вызвать.
public class MainClass
    {
        public MainClass()
        {
         // что-то делаем
        }
        //метод, в котором запускается поток из пункта 1
        public void MainMethod()
        {
            this.thread = new Thread(new ParameterizedThreadStart(this.Method1));
            this.thread.Start();
        }
  
        private void Method1()
        {

            frmProgress = new ProgressForm();//создаем форму, состояние которой надо менять при наступлении события
            
            Invoke(new ShowProgressCallback(this.ShowProgress));

            List<тип> objects... //список объектов, который обрабатываются и генерируют событие ProgressEvent
            ...
                //object - объект из списка
                object.ProgressEvent += new ProgressEventHandler(this.ProgressLoad); //определяем обработчик события  для объектов
            ...
            //Выполняем какую-то работу с этими объектам, в которой генерируется событие ProgressEvent
            ...
        }
       
        private void ShowProgress()
        {
            if (!frmProgress.Visible)
                frmProgress.Show();
        }
        private void ProgressLoad(object sender, ProgressEventArgs e)
        {
            Invoke(new ProgressLoadCallback(this.frmProgress.ChangeProgress),e); //
        }

        private Thread thread = null;
        private ProgressForm frmProgress = null;

        private delegate void ShowProgressCallback();
        private delegate void ProgressLoadCallback(ProgressEventArgs e);
       
    }

public class ProgressForm : Form
{
   public void ChangeProgress(ProgressEventArgs e)
   {
    //код по изменению состояние объекта в зависимости от входящего параметра
   }
}


З.Ы. надеюсь кто-то поймет, что я тут хотел сказать....
PM MAIL   Вверх
Uvs
Дата 15.9.2008, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Можно на форму бросить BackgroundWorker и на него повесить thread.

Thread subroutine_thread = new Thread(new ThreadStart(plg.AddedList));
subroutine_thread.Start();
bw.RunWorkerAsync(subroutine_thread);

на событие DoWork повесить обработчик:

    private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
      Thread outer_thread = (Thread)e.Argument;
      btnExecute.Enabled = !outer_thread.IsAlive;
      pb.Value = 0;
      while (outer_thread.IsAlive)
      {
        pb.PerformStep();
        if (pb.Value >= pb.Maximum) pb.Value = 0;
        Thread.Sleep(100);
      }
      pb.Value = 0;
      e.Result = outer_thread;
    }

    private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
      Thread outer_thread = (Thread)e.Result;
      btnExecute.Enabled = !outer_thread.IsAlive;
    }


 
PM MAIL ICQ Skype   Вверх
Jagerntr
Дата 16.9.2008, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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


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

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


 




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


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

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