предполагается, что "скачать" возвратит байтовый массив, или какой-то объект с картинкой.
таймаут возвратит 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>
no subject
предполагается, что "скачать" возвратит байтовый массив, или какой-то объект с картинкой. таймаут возвратит void, в простейшем случае. нажатие кнопки - в простейшем тоже возвратит void, ну или например возвратит, правой или левой кнопкой мышки нажато.
И вот оно общение: я прошу "дай картинку" - а мне через какое-то время ее возвращают, или говорят "сорри, таймаут/кнопка отмены". Но при этом код я пишу, как будто последовательный, что существенно его упрощает и делает наглядным.
Чуть сложней дело обстоит с генераторами. Их вроде доделали полностью в с++23. А может и в 20, точно не скажу.
Вы вроде скалу знаете? Помоему в скале генераторы есть - но я не уверен. Когда-то очень давно читал книжку по скале - но не более того. Генератор это почти то же самое, что поток данных, только каждая следующая порция данных приходит через неопределенное время. Условно псевдокод: