LINUX.ORG.RU

qt6 qfuture

 qfuture, ,


0

1

Кто-нибудь понял как с этим работать? В Qt5 QtConcurrentRun, QFutureWatcher понятное дело, а тут.

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

clang-format вообще не умет форматировать код с синтаксисом .then().then() etc.

Если у меня есть например void Example::download(const QUrl &url)
то что должно быть в auto future = QtConcurrent::run( здесь )?
(download, url)? компилятор ругается что download не static. Лямбды работают но выглядит аж тошно.

sad panda

★★★★★

Последнее исправление: bhfq (всего исправлений: 3)

Подозреваю что если дока пока мутная - рано туда лезть,ещё 10 раз переделают

mittorn ★★★★★
()
Последнее исправление: mittorn (всего исправлений: 1)
Ответ на: комментарий от static_lab

В том то и дело что нет никакого объекта example, я создают future в коде функции класса этого самого example, раньше писалось this первым аргументом, сейчас они решили что-то наломать…

bhfq ★★★★★
() автор топика
Ответ на: комментарий от bhfq

нет никакого объекта example, я создают future в коде функции класса этого самого example

Так его же нет :)

раньше писалось this первым аргументом

Определись: или у тебя объект есть и он this, или пытаешься функцию класса передать как статическую, на что компилятор и ругается.

static_lab ★★★★★
()
Последнее исправление: static_lab (всего исправлений: 1)
Ответ на: комментарий от static_lab

он как раз ругается на то что функция не статическая.

(download, url)? компилятор ругается что download не static.

https://qtpromise.netlify.app/qtpromise/getting-started.html#example

выглядит более человечным для qt5

просто хотелось код работающий в qt5 запустить под qt6, а они решили наломать дров.

bhfq ★★★★★
() автор топика
Последнее исправление: bhfq (всего исправлений: 1)
Ответ на: комментарий от bhfq

он как раз ругается на то что функция не статическая.

Я про это и говорю. А если она действительно не статическая и у тебя есть экземпляр класса (который this), то есть std::bind:

auto future = QtConcurrent::run(std::bind(&Example::download, this), url);
static_lab ★★★★★
()
Ответ на: комментарий от static_lab

Лямбды работают

то есть std::bind

static_lab ★★★★★

🤦🤦🤦

Не зря анонимы пишут

Ты экспертов местных поменьше слушай

fsb4000 ★★★★★
()
Ответ на: комментарий от static_lab

Никогда, никто на Земле не должен использовать bind, если можно использовать лямбды. Лямбды лучше во всём, и время компиляции меньше, и возможностей у оптимизатора больше.

Можешь посмотреть 7 минут по этой ссылке, там подробно объяснят чем плох bind: https://youtu.be/zt7ThwVfap0?t=1516

А можешь просто на годболте посмотреть ассемблер.

Или замерить время сборки с bind против лямбды.

Лямбда всегда лучше, для любого компилятора.

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от bhfq

C:\Users\krab\Desktop\Example\example.cpp(10): error C3867: ‘Example::download’: non-standard syntax; use ‘&’ to create a pointer to member

исходник в студию, похоже, что какая-то дичь там написана

static_lab ★★★★★
()
Ответ на: комментарий от fsb4000

добавляю тебя в игнор как неадеквата

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

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

slovazap ★★★★★
()
Ответ на: комментарий от static_lab

какая дичь, там написано auto future = QtConcurrent::run(download, url); QtCreator подсказывает что download должен быть static.

bhfq ★★★★★
() автор топика
Ответ на: комментарий от static_lab

так работает да, как работает не понятно, ну нафиг этот Qt6 пусть дополнят документацию и рабочие примеры, подожду релиза.

bhfq ★★★★★
() автор топика
Ответ на: комментарий от bhfq

std::bind превращает твой указатель на функцию класса в std::function и привязывает к нему параметр url, а его QtConcurrent::run умеет запускать (смотри в сигнатуру). В этой магии ничего qt-шного нет, чистый c++. Не думаю, что они в релизе Qt6 что-то изменят.

static_lab ★★★★★
()
Ответ на: комментарий от static_lab

ЯРОСТЬ

auto future = QtConcurrent::run(&Example::download, this, url);

Вот оно в чем дело. Эти гаврики из QtCompany решили поменять местами метод и обьект в конструкторе run.

Вот сравните:

https://doc.qt.io/qt-5/qtconcurrentrun.html
QFuture<void> future = QtConcurrent::run(&image, &QImage::invertPixels, QImage::InvertRgba);

https://doc-snapshots.qt.io/qt6-dev/qtconcurrentrun.html
QFuture<void> future = QtConcurrent::run(&QImage::invertPixels, &image, QImage::InvertRgba);

Нафига? Почему об этом не сказать в блог посте https://www.qt.io/blog/asynchronous-apis-in-qt-6 почему об этом не упомянуть в документации. Прямо вспоминаю ситуацию в предрелизами Qt 5 когда любой желающий мог зафигачить через gerrit свой код без документации, когда люди из емнип Digia сказали без документации релиза не будет - это блокирующий баг!

bhfq ★★★★★
() автор топика
Ответ на: ЯРОСТЬ от bhfq

У них описание текстом не совпадает с примерами кода. БТВ первый мой вариант юыл основан как раз на примерах: qt6 qfuture (комментарий) Вы его как-то проигнорировали, сказав, что у вас экземпляра класса нет (хотя это и не так было).

static_lab ★★★★★
()
Ответ на: ЯРОСТЬ от bhfq

Нафига?

Привели к нормальному плюсовому виду. Так bind принимает параметры, так thread принимает параметры.

anonymous
()
Ответ на: комментарий от anonymous

раз пошла такая пьянка давай те уже и синтаксис connect переделаем, но строить не ломать не благородное дело же.

bhfq ★★★★★
() автор топика
Ответ на: комментарий от slovazap

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

Siborgium ★★★★★
()
Ответ на: комментарий от Siborgium

Во-первых, ещё раз, если это место не боттлнек, он не менее производительный.

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

В общем случае разница примерно такая:

// дано:
// bool Example::download(const std::string& url, const std::unordered_map<std::string, std::string>& headers, std::string& response)

// каррирование нормального человека
using namespace std::placeholders;
auto a = std::bind(&Example::download, this, _1, _2, _3);

// каррирование недоделанного джуна, начитавшегося статеек о вреде bind, но не дочитавшего до статеек о преждевременной оптимизации 
auto b = [this](const std::string& url, const std::unordered_map<std::string, std::string>& headers, std::string& response) -> bool { return download(url, headers, response); }

// ...ну ок, пусть c++14, но всё равно не дай бог забыть &
auto c = [this](auto& url, auto& headers, auto& response) { return download(url, headers, response); }

// ...но тогда пусть и с++20
auto d = std::bind_front(&Example::download, this);
slovazap ★★★★★
()
Ответ на: комментарий от Siborgium

Ждал этого. А теперь, во-первых, угадай какая реализация у std::bind_front, а во-вторых, зафиксируй мне этим 3-й аргумент из 5. Ну и всё равно длиннее и уродливее.

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 2)
Ответ на: комментарий от slovazap

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

Но часто ли тебе приходится фиксировать 3-й аргумент из 5 в месте, где точно нет и никогда не будет боттлнека? Про преждевременную оптимизацию, кстати, не абсолютное утверждение.

Siborgium ★★★★★
()
Ответ на: комментарий от slovazap

А теперь, во-первых, угадай какая реализация у std::bind_front

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

Siborgium ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.