Доступ к элементу диалогового окна из нескольких потоков (C ++) - PullRequest
0 голосов
/ 25 мая 2011

У меня есть диалоговое окно с некоторыми элементами управления флажком.

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

Но пользователь также может изменять эти элементы управления флажками во время работы рабочего потока.

Хотя это маловероятно, может случиться так, что поток попытается прочитать некоторые из этих элементов в тот самый момент, когда пользователь захочет их изменить.

Как защитить элемент диалогового окна от одновременного доступа между основным потоком и рабочим потоком?

Полагаю, мне нужно создать мьютекс, и этот мьютекс легко использовать из рабочего потока, но я не вижу, куда можно вставить код для блокировки элемента диалога с тем же мьютексом, когда пользователь хочет изменить это.

Есть кто-нибудь, кто мог бы помочь мне с этим?

Заранее спасибо.
Гингко

1 Ответ

0 голосов
/ 25 мая 2011

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

Решение состоит в следующем:

  1. Создайте несколько частных логических полейсоответствующие флажкам в объекте, представляющем диалоговое окно.
  2. Всякий раз, когда пользователь изменяет флажок, обновляйте соответствующее логическое поле.
  3. Предоставляйте эти поля как свойства только для чтения для другихпотоки для чтения.
  4. (необязательно) Защитите весь доступ к логическим полям с помощью мьютекса.

Элемент 4 является необязательным, поскольку на всех известных мне архитектурах опасность разрыва не возникаетдоступ к логическому полю.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...