Я знаю, что для доступа к элементам управления пользовательского интерфейса из другого потока я должен использовать PostMessage()
. Однако PostMessage()
является асинхронным, поэтому, например, если я попытаюсь изменить текст элемента управления "EDIT"
, я не смогу удалить текстовый буфер, когда закончите, потому что я не знаю, когда оконная процедура завершит обработку сообщения.Как получить доступ к элементам управления пользовательского интерфейса из другого потока?
Таким образом, эти две идеи, которые я могу думать о том, чтобы доступ к элементам управления пользовательского интерфейса из другого потока:
- Создайте определенное пользователем сообщение, например, я посылаю к UI нить что-то вроде: "вставки эти 200 строк (все хранятся в одной строке, разделенные символом «\ n» или что-то еще) в
ListViewX
», и когда поток пользовательского интерфейса получает это сообщение, он обновляетListViewX
, и по завершении удаления строки (которая выделяется на куча). - Другой подход состоит в том, чтобы поместить код, который обращается к элементу управления пользовательского интерфейса внутри функции, и отправить указатель на поток пользовательского интерфейса, который затем вызовет его.
Имеет ли один из этих подходов некоторые преимущества перед другими, и существуют ли другие подходы к этому?
Если допустимо, чтобы поток блокировался до тех пор, пока поток пользовательского интерфейса не обработал сообщение, «SendMessage» - это еще один вариант. –
@Harry Johnston Я прочитал, что 'SendMessage()' может вызвать тупик (что не всегда легко предсказать). См .: http://flounder.com/workerthreads.htm, раздел: ** Рабочие потоки и графический интерфейс II: не трогайте GUI **. – user4582812
Я не согласен с интерпретацией этой статьи этой статьи. Тупик произошел из-за того, что поток GUI ожидал завершения рабочего потока и реализовал ожидание таким образом, что сообщения GUI не обрабатывались в то же время. Вы не должны этого делать, потому что даже если вы не зашли в тупик, графический интерфейс будет заморожен до тех пор, пока рабочий поток не завершится. Отказ от ответственности: я не являюсь экспертом в программировании GUI. –