Почему эта форма win перестает отвечать на запросы? - PullRequest
0 голосов
/ 17 ноября 2009

пользователь выбирает изображение (используя fileOpenDialog), затем мне нужно запустить 3 алгоритма последовательно (вывод одного алгоритма становится вводом другого) для этого изображения. Итак, я использую фоновый рабочий для запуска этих алгоритмов.

После каждого этапа я хочу увидеть изображение результата. Для этого я создал класс ImageViewer, который представляет собой простую форму, содержащую элемент управления PictureBox. Это то, что происходит в

   backgroundworker1_dowork()
   {
      Image img1 = runAlgo(img); //this statment is executing fine
      ImageViewer imgviewer1 = new ImageViewer(img1);
      imgviewer1.show();
   }

теперь imgviewer1 перестает отвечать на запросы (в заголовке показано НЕ ОТВЕЧАЕТ). И в нем нет изображения.

 //ImageViewer constructor
ImageViewer(Image img)
{
this.pictureBox1.Image = img;
}

Ответы [ 4 ]

3 голосов
/ 17 ноября 2009

Я предлагаю вам использовать BackgroundWorker для каждого алгоритма и поместить следующий код в событие RunWorkerComplete для BackgroundWorker:

  ImageViewer imgviewer1 = new ImageViewer((Image)e.Result);
  imgviewer1.show();

Передать результат обратно в событие DoWork, используя e.Result = img;

Я бы не советовал обновлять пользовательский интерфейс из события DoWork, так как оно запускается в другом потоке, и вам нужно реализовать некоторые методы взлома / вызова и т. Д., Чтобы заставить его работать. Гораздо лучше использовать BackgroundWorker, как и было задумано. То есть выполнить работу, а затем вернуть результат.

1 голос
/ 17 ноября 2009

Я предлагаю вам использовать стратегию создания одного экземпляра ImageViewer, написать код для установки изображения во внутреннем PictureBox в этом экземпляре (либо метод, либо свойство).

Обязательно обрабатывайте событие RunWorkerCompleted для каждого вызова BackGroundWorker и проверяйте наличие ошибок: см. Подробные сведения о возможных сложностях:

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.runworkercompleted.aspx

После каждого полного возврата от каждого из ваших последующих вызовов BackGroundWorker установите изображение в единственном экземпляре ImageViewer и используйте «Invalidate» или что-либо еще, чтобы вызвать перерисовку экрана. лучший

1 голос
/ 17 ноября 2009

Работа фонового рабочего выполняется в другом потоке, а не в потоке пользовательского интерфейса. Вы можете использовать Dispatcher.Invoke, чтобы убедиться, что некоторый код, который будет обновлять пользовательский интерфейс, будет выполняться в потоке пользовательского интерфейса.

0 голосов
/ 17 ноября 2009

Инициализирует компоненты, вызываемые в конструкторе ImageViewer перед назначением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...