172 похожих чатов

Aim: 1. Get this value (Vec<Channel>) ONCE AT STARTUP (in App::new()?) 2.

Put this value into App::update()

At startup, the App must get Channels ONCE from DB (async, before using App::update) and than use this cached data in UI.
I don't understand how I can do it in this case. Helps, please!

Можно на русском отвечать, это я просто из другого чата скопировал😅

Речь идёт про Egui. Может кто подсказать?

33 ответов

51 просмотр

https://docs.rs/tokio/latest/tokio/sync/struct.Mutex.html#method.try_lock И проверяй в цикле егуи каждый раз

Но вообще зачем тебе мьютекс

hardglitch- Автор вопроса
Victor
Но вообще зачем тебе мьютекс

Я ни от кого не могу добиться внятного руководства по egui, поэтому тычусь то там, то сям. До этого я с Qt 6 работал на питоне. Там всё гораздо проще хоть тоже тыкалсяб сам везде инфу собирал. Но от Qt бинарники очень пухлые получаются. Да и хочется на нативном расте всё сделать

Если сделаешь пример чтоб на плейграунде это поможет

hardglitch- Автор вопроса
Αλεχ Zhukovsky
Если сделаешь пример чтоб на плейграунде это помож...

Вот здесь можно код глянуть. Оно запускается, но там обращение к БД ещё в fn update() находится, что конечно же не правильно. Это открытый проект. Хочу сам обучиться и другим оставить для изучения https://github.com/hardglitch/rss-reader

hardglitch- Автор вопроса
hardglitch
screenshot Вот так это выглядит на данный момент

у меня есть подобный проект, где мьютексами шерю данные между тредами и через каналы тригерю логику. Насчет бест практис хз, я тут не стесняюсь в экспериментах, но работает https://github.com/antonguzun/lazy_crafter/blob/main/src/ui/ui_app.rs#L81

hardglitch
Я ни от кого не могу добиться внятного руководства...

Вот как раз из-за того опыта с Qt (и возможно другими обычными GUI библиотеками) у тебя (как у многих тут я смотрю) совсем не правильное понимание как надо работать с egui. Потому что в отличие от большинства GUI библиотек, работающих в retained mode, egui работает в immediate mode. А это означает, что у него самого полностью (ну на самом деле внутри него это чуть нарушается ради обработки сложного пользовательского ввода, но ты этого не видишь и не чувствуешь) отсутствует внутреннее состояние. И таким образом нет абсолютно никакой потребности для организации вызовов "из ядра в gui", которые в случае классических retained библиотек раскидываются по всем углам приложения. Т.е. в ту сторону (а вот в обратную, при перенаправление команд пользовательского ввода в ядро они возможно и могут пригодиться, но это уже зависит от устройства ядра) никакие каналы, мьютексы и т.п. не нужны и скорее могут только навредить. В случае egui тебе надо просто подготовить некое ядро приложения, которое будет предоставлять функции (не блокирующие и вообще максимально быстрые), возвращающие необходимый для отображения набор данных. А egui будет банально отображать эти данные 60 раз в секунду, вызывая эти функции каждый раз.

hardglitch- Автор вопроса
Alex
Вот как раз из-за того опыта с Qt (и возможно друг...

Это я уже понял. Мне бы реализацию глянуть. Все только общими фразами отделываются

Alex
Вот как раз из-за того опыта с Qt (и возможно друг...

egui всетаки позволяет производить рендер только по взаимодействию, например при движении мыши. Мне очень не хотелось жечь цпу просто так, поэтому выбрал такой вариант. Часть работы происходит в бекграунде и ui в случае отсутвия взаимодействия по таймеру перерендеривается. Тут удобны и каналы и мьютексы оказались

hardglitch
Я ни от кого не могу добиться внятного руководства...

Емнип детального руководства нет; надо экзамплы смотреть сначала, а из важного лейаутинг в документации описан. Дальше только виджеты кладёшь в лейаут с позициями и собираешь от них интересующий отклик (clicked и прочее).

hardglitch
Это я уже понял. Мне бы реализацию глянуть. Все то...

а что непонятного то по реализации? У тебя в любом случае есть реализация egui'ного (точнее на самом деле в eframe оно конечно же) App с функцией update в которой и происходит вся прорисовка. Делаешь себе новую сущность скажем с именем Core (и функциями типа get_data и update_data, не блокирующимися и не асинхронными) и кладёшь её в App. И потом просто вызываешь из update в нужных местах. А если в приложение встречаются какие-то нетривиальности с многопоточностью, асинхронностью и прочим, то они все будут сконцентрированы уже в твоём Core, т.е. вне egui. Т.е. речь идёт о том, что каким бы сложным в смысле параллельного выполнения и т.п. не было приложения, к egui это отношения иметь не будет (как раз в следствие использования immediate mode).

Anton Guzun
egui всетаки позволяет производить рендер только п...

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

Alex
да, и не просто позволяет а по дефолту как раз и у...

есть на примете хороший экземляр аппки на егуи? А то я полностью обмазался локами в ui треде

Anton Guzun
есть на примете хороший экземляр аппки на егуи? А ...

так а ты их демку (https://www.egui.rs) то смотрел? Там много чего есть, и редактор и анимация и т.д. И везде ссылка на реализующий код.

Anton Guzun
есть на примете хороший экземляр аппки на егуи? А ...

да, а по поводу твоих локов и т.п. - вообще не понятно откуда они могли взяться. Единственная во всём egui функция, которая может понадобиться "снаружи" https://docs.rs/egui/latest/egui/struct.Context.html#method.request_repaint позволяет вызов из любых потоков.

Alex
так а ты их демку (https://www.egui.rs) то смотрел...

не нашел в демо примерах взаимодействия с бекендом. Там же статика одна.

Саня Череп
Есть во вкладках сверху http запрос

так я про код говорю, там примеры на виджеты

а причём тут egui и взаимодействие с бэкендом? Это дело совсем другого кода и совсем других библиотек. Для egui ты просто готовишь набор нужных данных и он их отображает на экран. А как эти данные подготовлены egui вообще не касается.

Alex
а причём тут egui и взаимодействие с бэкендом? Это...

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

Anton Guzun
если эти данные готовятся в другом треде, то как з...

У меня сейчас данные сохраняются в Memory контекста, поэтому никаких мутехов

Anton Guzun
если эти данные готовятся в другом треде, то как з...

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

Саня Череп
У меня сейчас данные сохраняются в Memory контекст...

ну так то локи есть в самом контексте... ))) Но они там продуманы хотя бы)

Alex
ну так то локи есть в самом контексте... ))) Но он...

Ну я потому и использую, что уже продуманы. Самому с нуля костылить не вижу смысла

Alex
если данные считаются редко и долго, то кажется ло...

а передача владения между тредами как может быть реализована? Просто отправляем данные в канал и ui овверрайдит свой стейт новыми данными?

hardglitch- Автор вопроса
Alex
а что непонятного то по реализации? У тебя в любом...

Я к этому как раз пришёл, но застрял. Завтра попробую на свежую голову штурмануть ещё разок

hardglitch- Автор вопроса
Anton Guzun
не нашел в демо примерах взаимодействия с бекендом...

Там нету ничего. Я уже весь оф чат в дискорде затрахал своими вопросами😅

hardglitch- Автор вопроса
Anton Guzun
а передача владения между тредами как может быть р...

да) Но надо понимать пару нюансов: 1. канал внутри на самом деле тоже использует блокировки (но опять же продумано), так что надо весьма аккуратно с этим, если беспокоит производительность. 2. Если прокидывать канал, то условно говоря не "в гуи", а "в основной поток Core" или что-то такое - egui в этом процессе нигде не светится) Вроде как разницы нет, но это позволяет чётко отделять gui и реальную функциональность.

Alex
да) Но надо понимать пару нюансов: 1. канал внутри...

Спасибо, не подскажешь литературу/гайды для погружения. Интересно какие объемы данных целесообразно гонять через каналы.

hardglitch
А можешь код показать, если не секрет?

Сейчас не у компа, сорри, напиши в лс и я скину по возможности

Похожие вопросы

Обсуждают сегодня

Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Чтобы перехватить все нажимания буков на форме, надо хук ставить? Пробовал на форме ОнКейДаун, оно ловит клаву если фокус не на компоненте с вводом текста
Serjone
15
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
Всем привет! вывожу на общей стр дочерние ресурсыв каждом ресурсе галерея, и первая фотка должна выводиться на общей [!DocLister? &prepare=photo !]
Alekso
12
А можно вопрос? Мне сегодня сказали что у меня функция (которая просто заполняет массив значениями) не правильная void Full(double * arr, int n) { for (int i = 0; i < n; i...
† C E †
7
День добрый, подскажите пожалуйста, есть ли какой-то способ сказать ребару не компилировать определённое приложение? Всю доку их перечиатл ничего подобного не нашёл
Кирилл
14
Добрый вечер. Хочу чтобы у меня в классе поле было функцией, которая возвращает строку. Делаю так: interface ... TGetOutPath = function : String of object; ... protec...
Kirill Filippenok
12
Народ! Впервые клиенту пришло письмо от РКН, у вас, дескать, есть яндекс метрика, а нигде не написано, что вы ее юзаете. Никто не сталкивался?
Sasha Beep
10
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Здравствуйте, хочу сделать HelloWorld в консоли Дельфи, но функция API ничего не выводит, что я делаю не так? program Hello; {$APPTYPE CONSOLE} uses System.SysUtils, WinAPI.Wi...
Sergey Vinogradov
20
Карта сайта