Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Взаимодествие с пользовательским интерфейсом




 

Последним вопросом, который нам необходимо обсудить, является взаимодействие отдельного потока с пользовательским интерфейсом. На самом деле графический интерфейс пользователя (GUI) может исполняться только в том же потоке, в котором был создан. О том, как этого добиться, и рассказывает эта часть статьи.

 

WinForms

 

Пока что наиболее распространенным в.NET Framework API для создания пользовательского интерфейса для настольных приложения является WinForms. На мой взгляд, со временем его вытеснит WPF, но пока до этого еще далеко. Начнем же наше рассмотрение взаимодействия потоков с пользовательским интерфейсом в WinForms-приложениях (программа ThreadingWinFormsSynchronization).

 

Метод Invoke

 

Наиболее распространенным способом выполнить свой код гарантировано в основном потоке является использование метода Invoke класса Control. Этот метод гарантированно исполняет код переданного ему делегата в том потоке, в котором был создан соответствующий элемент Control:

Func<long> dlgt = new Func<long>(GetCheckNumber);

return (long) this.Invoke(dlgt);

 

Просто оберните вызов вашего метода в делегат и передайте его методу Invoke. Кроме того, класс Control имеет свойство InvokeRequired, позволяющий узнать, нужно ли вызывать для вашего коде Invoke, или можно выполнять его напрямую. В связи с этим полный код метода, который должен выполняться в потоке пользовательского интерфейса, выглядит следующим образом:

private long GetCheckNumber()

{

if (this.InvokeRequired)

{

Func<long> dlgt = new Func<long>(GetCheckNumber);

return (long) this.Invoke(dlgt);

}

else

{

return long.Parse(tbNumber.Text);

}

}

 

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

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных