2008-10-20 5 views
2

Если у меня есть функция в потоке, которая обрабатывает некоторые данные, тогда она вызывает функцию обратного вызова для обновления статуса в пользовательском интерфейсе.Как работает процесс обновления потока пользовательского интерфейса из рабочего потока?

Если пользовательский интерфейс требует времени для обработки функции обратного вызова, это не так полезно. Вместо того, чтобы просто обрабатывать обновление в функции обратного вызова, должно ли оно отправлять какое-то сообщение в пользовательский интерфейс таким образом, чтобы он не блокировался?

Я имею в виду, что когда в функции обработки и я вызываю функцию статуса обновления, это должно немедленно возвращаться к функции обработки, а затем в обновлении она может ждать все, что требуется для завершения обновления пользовательского интерфейса.

Или мне нужен третий поток для обработки отправляемых данных обновления в пользовательский интерфейс?

ответ

0

Mapad опубликовал ссылку на UI и темы here, которые могут вам пригодиться. Вы не указали, какой набор инструментов UI и какой язык я не могу вам дать.

+0

Что я не понимаю, так это то, как не блокировать, когда вы вызываете обновление – CiNN 2008-10-20 06:32:07

+0

windows_notify - это ответ. вам нужно уведомить «родительский» виджет. – TheObserver 2008-10-20 06:48:59

2

Обычно существует способ отправки обратного вызова в поток пользовательского интерфейса без блокировки.

Например:

Я уверен, что если вы смотрите на документы для инструментария пользовательского интерфейса, который вы используете, вы найдете что-то подобное.

2

В .NET (WinForms, WPF, Silverlight) вам просто нужно использовать объект Dispatcher в потоке пользовательского интерфейса, чтобы вызвать метод обновления для пользовательского интерфейса. Диспетчеры могут быть вызваны либо синхронно (с использованием Invoke) либо async (с использованием BeginInvoke/EndInvoke). Обратите внимание, что в .NET существует требование вызвать EndInvoke для каждого BeginInvoke (becuase .NET не дает вам гарантии, что дескрипторы async будут освобождены), поэтому Fire и Forget по умолчанию не являются опцией (если вы не используете реализовать свой собственный FireAndForget)

Смежные вопросы