Я пытаюсь использовать Coroutines с Qt.
Вот минимальный (я думаю) пример, чтобы воспроизвести мою проблему
, в основном, код Bellow принят из примера Cppreference здесь:
https://en.cppreference.com/w/cppretine ... e.htmlенно PrettyPrint-Override ">#include
#include
#include
#include
template
struct task
{
struct promise_type
{
auto get_return_object()
{
return task(std::coroutine_handle::from_promise(*this));
}
std::suspend_always initial_suspend() { return {}; }
struct final_awaiter
{
bool await_ready() noexcept { return false; }
void await_resume() noexcept {}
std::coroutine_handle
await_suspend(std::coroutine_handle h) noexcept
{
if (auto previous = h.promise().previous; previous)
return previous;
else
return std::noop_coroutine();
}
};
final_awaiter final_suspend() noexcept { return {}; }
void unhandled_exception() { throw; }
void return_value(T value) { result = std::move(value); }
T result;
std::coroutine_handle previous;
};
task(std::coroutine_handle h) : coro(h) {}
task(task&& t) = delete;
~task() { coro.destroy(); }
struct awaiter
{
bool await_ready() { return false; }
T await_resume() { return std::move(coro.promise().result); }
auto await_suspend(std::coroutine_handle h)
{
coro.promise().previous = h;
return coro;
}
std::coroutine_handle coro;
};
awaiter operator co_await() { return awaiter{coro}; }
T operator()()
{
coro.resume();
return std::move(coro.promise().result);
}
private:
std::coroutine_handle coro;
};
class qt_timeout {
int m_delay = 0;
public:
qt_timeout(int delay) noexcept : m_delay{delay} {}
auto await_ready() const noexcept { return false; }
auto await_suspend(std::coroutine_handle h) noexcept
{ QTimer::singleShot(m_delay, qApp, [h] { h.resume(); }); }
auto await_resume() noexcept {}
};
auto timeout(int ms) -> task
{
co_await qt_timeout(ms);
co_return ms;
}
auto main(int argc, char **argv) -> int
{
QCoreApplication app{argc, argv};
QMetaObject::invokeMethod(&app, [] {
auto t = timeout(1000);
const auto r = t();
qDebug()
Подробнее здесь: https://stackoverflow.com/questions/797 ... ne-with-qt
Как использовать C ++ Coroutine с QT? ⇐ C++
Программы на C++. Форум разработчиков
1754225785
Anonymous
Я пытаюсь использовать Coroutines с Qt.
Вот минимальный (я думаю) пример, чтобы воспроизвести мою проблему
, в основном, код Bellow принят из примера Cppreference здесь:
https://en.cppreference.com/w/cppretine/noop_coroutine.htmlенно PrettyPrint-Override ">#include
#include
#include
#include
template
struct task
{
struct promise_type
{
auto get_return_object()
{
return task(std::coroutine_handle::from_promise(*this));
}
std::suspend_always initial_suspend() { return {}; }
struct final_awaiter
{
bool await_ready() noexcept { return false; }
void await_resume() noexcept {}
std::coroutine_handle
await_suspend(std::coroutine_handle h) noexcept
{
if (auto previous = h.promise().previous; previous)
return previous;
else
return std::noop_coroutine();
}
};
final_awaiter final_suspend() noexcept { return {}; }
void unhandled_exception() { throw; }
void return_value(T value) { result = std::move(value); }
T result;
std::coroutine_handle previous;
};
task(std::coroutine_handle h) : coro(h) {}
task(task&& t) = delete;
~task() { coro.destroy(); }
struct awaiter
{
bool await_ready() { return false; }
T await_resume() { return std::move(coro.promise().result); }
auto await_suspend(std::coroutine_handle h)
{
coro.promise().previous = h;
return coro;
}
std::coroutine_handle coro;
};
awaiter operator co_await() { return awaiter{coro}; }
T operator()()
{
coro.resume();
return std::move(coro.promise().result);
}
private:
std::coroutine_handle coro;
};
class qt_timeout {
int m_delay = 0;
public:
qt_timeout(int delay) noexcept : m_delay{delay} {}
auto await_ready() const noexcept { return false; }
auto await_suspend(std::coroutine_handle h) noexcept
{ QTimer::singleShot(m_delay, qApp, [h] { h.resume(); }); }
auto await_resume() noexcept {}
};
auto timeout(int ms) -> task
{
co_await qt_timeout(ms);
co_return ms;
}
auto main(int argc, char **argv) -> int
{
QCoreApplication app{argc, argv};
QMetaObject::invokeMethod(&app, [] {
auto t = timeout(1000);
const auto r = t();
qDebug()
Подробнее здесь: [url]https://stackoverflow.com/questions/79723800/how-to-use-c-coroutine-with-qt[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия