gpt4 book ai didi

c++ - 如何在 std::thread 中正确嵌入 QEventLoop?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:42:11 26 4
gpt4 key购买 nike

有一个包含 std::thread 的对象,我想在对象被销毁时完成。

最少的工作代码:

#include <thread>
#include <future>
#include <QEventLoop>

struct Connector
{
Connector(std::string addr, std::function<void(std::string)> cb)
{
std::promise<void> barrier;
auto fut = barrier.get_future();

m_worker = std::thread([addr, cb, &barrier]()
{
QEventLoop loop;
QTimer::singleShot(0, [this, &barrier, &loop]
{
m_quit = [&loop] { QTimer::singleShot(0, &loop, &QEventLoop::quit); };
barrier.set_value();
});

MySocket s(addr, cb);

loop.exec();
});

fut.wait();
}

~Connector()
{
m_quit();
m_worker.join();
}

std::thread worker;
std::function<void()> m_quit;
};

它变得非常复杂:只有在 loop 进入 exec() 之后,你才能在 loop 上调用 exit(),你可以'在线程外创建循环

我只有一个信号量的解决方案,该信号量由在此循环中排队等待执行的处理程序释放。当信号量被释放时,我可以确定循环已创建并正在运行,因此它可以在需要时用 quit() 消息终止。

我是否缺少更简单的方法?

最佳答案

也许您可以将对 QEventLoop 的 unique_ptr 的引用传递给线程,并在销毁时调用该指针上的 exit。像这样:

#include <thread>
#include <QEventLoop>

struct Connector
{
Connector()
{
m_worker = std::thread([=]()
{
event_loop = std::make_unique<QEventLoop>();
loop->exec();
});
}

~Connector()
{
event_loop->exit();
m_worker.join();
}

std::unique_ptr<QEventLoop> event_loop;
std::thread worker;
};

关于c++ - 如何在 std::thread 中正确嵌入 QEventLoop?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47432720/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com