Однопоточный типа мьютекс
От: Hоmunculus  
Дата: 23.01.26 12:29
Оценка:
Есть однопоточная программа.
Есть два контрола, полностью друг друга дублирующие. Не спрашивайте зачем. Так надо. Изменения в первом тут же отоьражаются на втором и наоборот.
Естественно уходим в зацикливание.
Да, булевский флаг вопрос решает. Типа в одном оботабоьчике поднимаем, во втором проверяем и выходим. Типа мьютекса. Но как-то это допотопно. Есть красивые современные решения?
Re: Однопоточный типа мьютекс
От: Chorkov Россия  
Дата: 23.01.26 12:45
Оценка: +2
Здравствуйте, Hоmunculus, Вы писали:

H>Есть однопоточная программа.

H>Есть два контрола, полностью друг друга дублирующие. Не спрашивайте зачем. Так надо. Изменения в первом тут же отоьражаются на втором и наоборот.
H>Естественно уходим в зацикливание.
H>Да, булевский флаг вопрос решает. Типа в одном оботабоьчике поднимаем, во втором проверяем и выходим. Типа мьютекса. Но как-то это допотопно. Есть красивые современные решения?

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

Флаги здесь ненужны.
Re: Однопоточный типа мьютекс
От: Философ Ад http://vk.com/id10256428
Дата: 23.01.26 12:46
Оценка:
Здравствуйте, Hоmunculus, Вы писали:

H>Да, булевский флаг вопрос решает. Типа в одном оботабоьчике поднимаем, во втором проверяем и выходим. Типа мьютекса. Но как-то это допотопно. Есть красивые современные решения?


Мне знакома эта задача. Этот вопрос не имеет отношения к C++.
Не знаю "более красивых" решений, мне они неизвестны. Думаю, единственное нормальное рабочее решение — завести bool m_updatingControls, чтобы потом его проверять в обработчиках TextChanged или ValueChanged, но тут ещё важно следить за тем чтобы не было логики в контролах (иначе запутаешься, разруливая диспатчинг).
Всё сказанное выше — личное мнение, если не указано обратное.
Отредактировано 23.01.2026 13:00 Философ . Предыдущая версия .
Re[2]: Однопоточный типа мьютекс
От: Hоmunculus  
Дата: 23.01.26 12:48
Оценка:
Здравствуйте, Философ, Вы писали:

Ну так и сделал. Все работает. Вопрос в поиске красоты
Re: Однопоточный типа мьютекс
От: Muxa  
Дата: 23.01.26 12:49
Оценка: +1
H>Есть красивые современные решения?

Не триггерить ивент если новое значение контролла равно текущему.
Re[3]: Однопоточный типа мьютекс
От: Pzz Россия https://github.com/alexpevzner
Дата: 23.01.26 13:44
Оценка: +3 :)
Здравствуйте, Hоmunculus, Вы писали:

H>Ну так и сделал. Все работает. Вопрос в поиске красоты


Перепиши код шестистопным ямбом.

P.S. Про идею не триггерить событие, если ничего не поменялось, тебе уже сказали...
Re: Однопоточный типа мьютекс
От: Pavel Dvorkin Россия  
Дата: 23.01.26 13:50
Оценка: -1
Здравствуйте, Hоmunculus, Вы писали:

H>Есть однопоточная программа.

H>Есть два контрола, полностью друг друга дублирующие. Не спрашивайте зачем. Так надо. Изменения в первом тут же отоьражаются на втором и наоборот.
H>Естественно уходим в зацикливание.
H>Да, булевский флаг вопрос решает. Типа в одном оботабоьчике поднимаем, во втором проверяем и выходим. Типа мьютекса. Но как-то это допотопно. Есть красивые современные решения?

Определить понятие "источник изменения". Если им является парный контрол, то не сообщать ему об изменении. Сообщать только если источником является некто третий.

Кстати, если C#, то там в любом обработчике есть параметр Sender.

В C# sender — это, как правило, первый параметр в методах обработки событий (event handler), ссылающийся на объект, который инициировал событие. Он имеет тип object, позволяя определить, какой конкретно элемент управления (например, кнопка) вызвал код. Используется в механизме EventHandler для управления событиями.


ИИ, конечно.
With best regards
Pavel Dvorkin
Re[2]: Однопоточный типа мьютекс
От: Философ Ад http://vk.com/id10256428
Дата: 23.01.26 14:03
Оценка: 4 (1) +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Определить понятие "источник изменения". Если им является парный контрол...


Очень плохая идея! Контрол не должен знать о существовании других контролов, в идеальном случае вообще не знать, ни при каких обстоятельствах Для последнего лучше всего заводить GUI-manager, который будет поставлять контролы и диалоги. Это уменьшает связность и позволяет реиспользовать контролы. Если у тебя один контрол прибит к другому, то править код сложно, использовать контролы в другом месте (напр. в другом проекте) тоже сложно.
Моя практика показала, что использование Sender — плохая идея. А вот надстройка над моделью — ViewModel — хорошая. Это стоит делать, даже если это не WPF, и MVVM для этого конкретного фрэйморка чужеродно. Задача ViewModel — адаптировать модель так, чтобы её мог отобразить и другим способом использовать контрол. Sender стоит использовать только для того, чтобы из него вытаскивать хэндл для ParentControl или ParentWindow: не стоит через него делать логику отображения. Использование INotifyPropertyChanged или INotifyCollectionChanged из ViewModel — тоже хорошая идея.
Всё сказанное выше — личное мнение, если не указано обратное.
Отредактировано 23.01.2026 14:06 Философ . Предыдущая версия .
Re[3]: Однопоточный типа мьютекс
От: Философ Ад http://vk.com/id10256428
Дата: 23.01.26 14:10
Оценка:
Здравствуйте, Hоmunculus, Вы писали:

H>Ну так и сделал. Все работает. Вопрос в поиске красоты


В таких вещах другого плана вопрос возникает: кто кем владеет и кто кого уведомляет. Вот здесь, да — поле для поиска красоты.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[3]: Однопоточный типа мьютекс
От: Pavel Dvorkin Россия  
Дата: 23.01.26 14:20
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>Очень плохая идея! Контрол не должен знать о существовании других контролов, в идеальном случае вообще не знать, ни при каких обстоятельствах


В теории да, но не всегда стоит строго следовать ей. И в данном случае, мне кажется, это будет самое простое решение, буквально из 1-2 строк.

По сути тут некий неявный класс "парный контрол". Можно его и явным сделать (для того, чтобы удовлетворить высокой теории ), и тогда вопрос о том, кто что знает, снимается сам собой.
With best regards
Pavel Dvorkin
Re[4]: Однопоточный типа мьютекс
От: Философ Ад http://vk.com/id10256428
Дата: 23.01.26 14:34
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

Ф>>Очень плохая идея! Контрол не должен знать о существовании других контролов, в идеальном случае вообще не знать, ни при каких обстоятельствах

PD>В теории да, но не всегда стоит строго следовать ей. И в данном случае, мне кажется, это будет самое простое решение, буквально из 1-2 строк.

На практике: практика показывает, что правила всё-таки нужны. На старте может показаться, что скоростное решение в 2 строки сдесь годится, но уже через год ты жалеешь о том, что поддался соблазну написать "быстро". Вот это "быстро сейчас" потом оборачивается головной болью. Это дурацкая привычка, писать как быстрее в данный момент, не задумываясь о будущем — о том, как ты это будешь потом поддерживать.

PD>По сути тут некий неявный класс "парный контрол"...


Это он в данном контексте парный, но контекст может поменяться, притом с высокой вероятностью. Нельзя связывать контролы напрямую — только через промежуточный объект, и лучше, если это будет специально приспособленный объект, отвечающий за подготовку данных для отображения. Иначе потом развязывать сложно. Иначе потом будет ещё одно костыльное решение, а потом ещё одно, и ещё...
Всё сказанное выше — личное мнение, если не указано обратное.
Отредактировано 23.01.2026 14:39 Философ . Предыдущая версия . Еще …
Отредактировано 23.01.2026 14:38 Философ . Предыдущая версия .
Re[5]: Однопоточный типа мьютекс
От: graniar  
Дата: 23.01.26 19:36
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>На практике: практика показывает, что правила всё-таки нужны. На старте может показаться, что скоростное решение в 2 строки сдесь годится, но уже через год ты жалеешь о том, что поддался соблазну написать "быстро". Вот это "быстро сейчас" потом оборачивается головной болью. Это дурацкая привычка, писать как быстрее в данный момент, не задумываясь о будущем — о том, как ты это будешь потом поддерживать.


А с другой стороны, ты можешь потратить несколько дней на создание "правильной архитектуры" вместо костыля, а применив на практике, сразу поймешь, что это не то, что нужно, и все труды насмарку. Костыль может быть хорошим инструментом для исследования. Главное вовремя их рефакторить, когда теория более-менее устаканивается.
Re[6]: Однопоточный типа мьютекс
От: Философ Ад http://vk.com/id10256428
Дата: 24.01.26 13:43
Оценка:
Здравствуйте, graniar, Вы писали:

G>А с другой стороны, ты можешь потратить несколько дней на создание "правильной архитектуры" вместо костыля, а применив на практике, сразу поймешь, что это не то, что нужно, и все труды насмарку. Костыль может быть хорошим инструментом для исследования. Главное вовремя их рефакторить, когда теория более-менее устаканивается.


Дело в том, что вовсе не обязательно "создавать архитектуру" — в большинстве случаев достаточно придерживаться базовых принципов и базовых целей. Например, базовая цель: низкая связность. Она даёт возможность реиспользовать компоненты, из обратного: высокая связность мешает отодрать от решения какой-то компонент для того, чтобы использовать его в другом месте или в ином качестве. Для уменьшения связности существуют уже зарекомендовавшие себя решения — паттерны проектирования. Если ты читал банду четырёх, то знаешь — паттерны проектирования они определили именно так. Ещё базовый принцип: SRP — в дальнейшем позволяет вносить точечные изменения, не затрагивая другие части системы. Например, для изменения отображения отдельного компонента изменение вносится только в код отображения и гарантированно не ломает бизнес-логику.
Пытаясь следовать этим целям и принципам ты автоматически делаешь удобоваримую архитектуру, не особо тратясь на её "изобретение".
Всё сказанное выше — личное мнение, если не указано обратное.
Re[7]: Однопоточный типа мьютекс
От: graniar  
Дата: 24.01.26 15:47
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>Дело в том, что вовсе не обязательно "создавать архитектуру" — в большинстве случаев достаточно придерживаться базовых принципов и базовых целей. Например, базовая цель: низкая связность. Она даёт возможность реиспользовать компоненты, из обратного: высокая связность мешает отодрать от решения какой-то компонент для того, чтобы использовать его в другом месте или в ином качестве.


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

Но иногда, для отладки или эксперимента, возникает потребность временно воткнуть костыль, могу даже член класса воткнуть, без отступа пишу, чтоб сразу было видно что ему тут не место.
Или в код библиотеки могу воткнуть пользовательский инклуд, привести объект к производному классу и закинуть инфу в лог.
И как ни странно не ощущаю себя святотатцем. Разве что иногда можно ворнинг добавить, чтоб не забыть прибраться потом.
Re: Однопоточный типа мьютекс
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 24.01.26 22:31
Оценка: 2 (1)
Здравствуйте, Hоmunculus, Вы писали:

H>Есть красивые современные решения?

MVC и порождённые паттерны тебе помогут.
Sic luceat lux!
Re[3]: Однопоточный типа мьютекс
От: Doom100500 Израиль  
Дата: 25.01.26 08:30
Оценка:
Здравствуйте, Hоmunculus, Вы писали:

H>Здравствуйте, Философ, Вы писали:


H>Ну так и сделал. Все работает. Вопрос в поиске красоты


Document-View Model. В MFC MDI интерфейсах давно продвигалось
Спасибо за внимание
Re: Однопоточный типа мьютекс
От: K13 http://akvis.com
Дата: 26.01.26 09:26
Оценка:
Здравствуйте, Hоmunculus, Вы писали:

H>Да, булевский флаг вопрос решает. Типа в одном оботабоьчике поднимаем, во втором проверяем и выходим. Типа мьютекса. Но как-то это допотопно. Есть красивые современные решения?


Qt решает эту проблему просто: если новое и старое значения совпадают, оповещение "значение изменилось" не создается, каллбаки не дергаются.
т.е. первым делом в местоде setValue делается проверка
if ( newValue == value() )
  return;


и тогда любое зацикливание разрывается автоматически.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.