chabapok ([personal profile] chabapok) wrote 2025-02-24 02:36 pm (UTC)

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

И вот оно общение: я прошу "дай картинку" - а мне через какое-то время ее возвращают, или говорят "сорри, таймаут/кнопка отмены". Но при этом код я пишу, как будто последовательный, что существенно его упрощает и делает наглядным.

Чуть сложней дело обстоит с генераторами. Их вроде доделали полностью в с++23. А может и в 20, точно не скажу.

Вы вроде скалу знаете? Помоему в скале генераторы есть - но я не уверен. Когда-то очень давно читал книжку по скале - но не более того. Генератор это почти то же самое, что поток данных, только каждая следующая порция данных приходит через неопределенное время. Условно псевдокод:

int foo(int max, int pause_seconds) {
  for(i=0; i
[Error: Irreparable invalid markup ('<max;>') in entry. Owner must fix manually. Raw contents below.]

<p>предполагается, что "скачать" возвратит байтовый массив, или какой-то объект с картинкой. таймаут возвратит void, в простейшем случае. нажатие кнопки - в простейшем тоже возвратит void, ну или например возвратит, правой или левой кнопкой мышки нажато.</p> <p>И вот оно общение: я прошу "дай картинку" - а мне через какое-то время ее возвращают, или говорят "сорри, таймаут/кнопка отмены". Но при этом код я пишу, как будто последовательный, что существенно его упрощает и делает наглядным.</p> <p>Чуть сложней дело обстоит с генераторами. Их вроде доделали полностью в с++23. А может и в 20, точно не скажу.</p> <p>Вы вроде скалу знаете? Помоему в скале генераторы есть - но я не уверен. Когда-то очень давно читал книжку по скале - но не более того. Генератор это почти то же самое, что поток данных, только каждая следующая порция данных приходит через неопределенное время. Условно псевдокод:</p> <pre> int foo(int max, int pause_seconds) { for(i=0; i<max; i++){ co_yield i; // "посылаем" очередное значение co await delay(pause_seconds); //и подождем } } int main(){ auto gen = foo(300, 4) for(;;) { println( co_await gen() ); } } </pre> <p>Мы сказали генератору "сделай нам 300 значений с паузой 4 сек между ними" и каждый вызов gen() как бы продолжает исполнение сопрограммы дальше, а каждый co_yield это почти как co_return: возвращает значение, только это не полностью выход, а просто приостановка+возврат значения, с возможностью потом продолжить дальше. Тут, кстати, я не знаю, что будет, когда оно досчитает до 300. Этот псевдокод просто не демонстриует, что должно быть. Как правильно завершить, я не знаю. С генераторами я плотно не разбирался. Понятно, что там есть некоторый механизм, чтобы понять, что генератор окончил работу.</p> <p>Генераторы - штука специфическая, как по мне оно нужно сильно реже. Я совершенно точно хочу нормальную либу для сопрограмм в qt, и чтобы в ней были комбинаторы (типичное использование - для одновременного запуска сопрограммы и ее таймаута). А вот куда приложить генераторы - так навскидку я не знаю. Или у меня нет таких задач - или я не привык мыслить такими категориями. Возможно, таймер с постоянным периодом имеет смысл делать на базе генератора а не как корутину, просто чтобы реже делало аллокации/деаллокации. Ну то есть, штука интересная - но куда ее совать.</p>

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting