Несколько прослушивателей свойств ждут, пока оба инициируют обратный вызов

У меня небольшие проблемы с Matlab в отношении прослушивателей свойств. Я добавил прослушиватель к свойствам XLim и YLim оси, срабатывающим PostSet:

h = addlistener(myaxes,{'XLim','YLim'},'PostSet',@myfunc);

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

При использовании инструмента масштабирования на осях свойства всегда изменяются в обоих случаях и всегда в порядке x, затем y. Так что в этом случае у меня не было бы проблем, но иногда я устанавливаю свойства XLim или YLim программно и хочу, чтобы одна и та же функция запускалась. Каким-то образом я должен быть в состоянии сказать, только одно из этих двух свойств вызвало слушателя или оба.

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


person Andrei    schedule 17.07.2015    source источник


Ответы (1)


Я не верю, что можно обнаружить «одновременное» set напрямую, потому что фактические назначения свойств, а не только события PostSet, выполняются отдельно, и никакая дополнительная информация не передается обратному вызову PostSet, который позволяет узнать другое. приближается. Остановившись на точке останова в первом обратном вызове, оси полностью обновятся до своих новых XLim без каких-либо признаков предстоящего изменения на YLim.

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

  • Используйте таймер на каком-то этапе, чтобы разрешить возможное назначение YLim для запуска второго обратного вызова до завершения работы обратного вызова XLim PostSet
  • Создайте пользовательскую процедуру для назначения XLim без YLim, чтобы каким-то образом отличаться от назначений, сделанных такими вещами, как инструмент масштабирования.
  • Используйте тот факт, что инструмент масштабирования сначала устанавливает свойство XLimMode, независимо от того, изменилось ли его значение. Установка XLim программно не установит XLimMode, если его значение уже равно manual.
person Will    schedule 21.10.2015