Мое приложение использует библиотеку обработки изображений для обработки длительных задач. Основной интерфейс с настройками и элементами управления реализован в WPF. Обработка изображений должна отображаться, а основной интерфейс должен оставаться отзывчивым. После нажатия кнопки «Процесс» в основном пользовательском интерфейсе создается новый поток, который создает новое окно WinForm для отображения обработанных изображений.
Перед многопоточностью пользовательский интерфейс зависал во время обработки, и прогресс отображался в WinForm для отображения изображений. Затем, когда обработка завершится, WinForm останется с изображением в нем. События добавляются в новую WinForm, которые позволяют панорамирование и масштабирование. Функциональность панорамирования и масштабирования работала правильно.
Из-за требований проекта стало очевидно, что для правильной работы он должен быть многопоточным.
Теперь с новым потоком окно WinForm создается, как и раньше, и изображение обрабатывается и отображается. Проблема в том, что когда этот метод завершен, поток завершается. Наличие выхода из потока означает, что если выделенные буферы изображения не освобождаются, то приложение выдает исключение. Чтобы это исправить, существует метод, который вызывается для освобождения всех выделений до выхода из потока. Это исправляет исключение и заставляет весь поток успешно выполняться, но это означает, что буфер отображения изображения и форма для его отображения освобождаются / удаляются, и поэтому нет времени, доступного для событий масштабирования и панорамирования.
Лучшее решение, чтобы сделать поток не выходящим, это сделать AutoResetEvent и сделать что-то подобное в конце потока обработки изображения.
while (!resetEvent.WaitOne(0, false)) { }
threadKill(); // frees all allocations
AutoResetEvent запускается кнопкой на главном пользовательском интерфейсе, который убивает поток. Это работает так, чтобы изображение отображалось столько времени, сколько необходимо и явно уничтожено пользователем, однако оно не позволяет запускать события Click и Drag, необходимые для панорамирования и масштабирования изображения. Есть ли способ сделать так, чтобы поток не выходил, не имея вращающегося цикла while, который предотвращает запуск событий? Желаемая функциональность заключается в том, чтобы поток оставался активным, чтобы не требовалось освобождать выделения и выполнять панорамирование и масштабирование.
Несмотря на то, что решение может быть очевидно для кого-то с большим опытом работы с потоками, любая помощь будет принята, поскольку я новичок в многопоточных приложениях.
Спасибо
РЕДАКТИРОВАТЬ: Следует знать, что конечной целью является отображение постоянного потока кадров, которые обрабатываются таким образом, взятые из захвата кадров. Поэтому я не думаю, что это сработает, чтобы обрабатывать их отдельно в фоновом режиме, а затем отображать их в основном пользовательском интерфейсе, потому что будет необходим постоянный поток дисплеев, и это заблокирует основной пользовательский интерфейс.
РЕДАКТИРОВАТЬ: реальная цель вопроса не в том, чтобы найти лучший способ сделать что-то подобное. Вместо этого я спрашиваю, можно ли остановить новый поток, чтобы завершить события щелчка. Если такое поведение не может быть достигнуто с помощью System.Threading.Thread, то утверждение, что оно не может быть достигнуто, также будет приемлемым ответом.