Получение снимка замедляет пользовательский интерфейс - необходим поток? - PullRequest
1 голос
/ 13 сентября 2010

В настоящее время я работаю над приложением WPF / C #, которое подключено к внешней камере.Это приложение получает снимок с камеры, затем выполняет некоторый анализ и отображает его на экране через пользовательский интерфейс.В интерфейсе также есть много других элементов пользовательского интерфейса (таких как кнопки, меню и выпадающие списки).Прямо сейчас, когда приложение работает, пользовательский интерфейс заметно замедлен - например, при нажатии на комбинированный список может застыть за секунду до открытия.Затем он может снова зависнуть, прежде чем позволить пользователю выбрать значение.Я почти уверен, что это происходит из-за того, что моментальный снимок получен в том же потоке, что и во всем пользовательском интерфейсе, однако я очень наивен в отношении правильного использования потоков и совершенно не понимаю, как правильно решить эту проблему.,По сути, я хочу, чтобы пользовательский интерфейс вообще не был заметен медленнее, даже несмотря на то, что самое быстрое, что я могу получить, - примерно 1 / секунду с камеры.Как я могу разделить это на несколько потоков?И поможет ли это даже моей проблеме?Спасибо;любая помощь высоко ценится.

Ответы [ 2 ]

3 голосов
/ 13 сентября 2010

Если вы не используете .NET 4, вы можете использовать BackgroundWorker.

BackgroundWorker worker = new BackgroundWorker();

worker.DoWork += (s, e) => 
{
    // Perform things on the background thread here.
};
worker.RunWorkerCompleted += (s, e) =>
{
    // Code to be run after the thread is done, on the UI-thread.
};
worker.RunWorkerAsync();
1 голос
/ 13 сентября 2010

Если у вас есть доступ к .NET 4, вы можете настроить Task для получения снимка и продолжение для обновления графического интерфейса.Задача будет выполняться в потоке пула потоков, оставляя ваш пользовательский интерфейс отзывчивым.Не забудьте использовать планировщик FromCurrentSynchronizationContext для продолжения.

var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext;
var task = Task.Factory.StartNew( () => { // Get snapshot })
    .ContinueWith(t => { // update ui }, uiScheduler);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...