Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > многопоточность и Form


Автор: Jagerntr 11.9.2008, 14:04
добрый день. Ситуация следущая:

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)
   {
    //код по изменению состояние объекта в зависимости от входящего параметра
   }
}


З.Ы. надеюсь кто-то поймет, что я тут хотел сказать....

Автор: Uvs 15.9.2008, 14:17
Можно на форму бросить 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;
    }


 

Автор: Jagerntr 16.9.2008, 11:40
спасибо за совет.Как попробую данный прием - отвечу.Еще раз спасибоsmile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)