gpt4 book ai didi

multithreading - 在等待通知std::condition_variable的过程中执行 “wait callback”

转载 作者:行者123 更新时间:2023-12-03 13:04:31 28 4
gpt4 key购买 nike

我这样使用std::condition_variable:

void wait()
{
std::unique_lock<std::mutex> lock(m_stateCompletedMutex);

m_waitCondition.wait(lock, [this](){return (m_state == STATE_COMPLETED);});
}

我对此很满意,但是现在我想在“等待期间”执行一些代码(我不知道我是否可以这样说,但这是个主意),例如更新GUI或增加一个等待计数器,或其他。

说我们正在使用Qt,我已经尝试过这样的事情:
void wait()
{
std::unique_lock<std::mutex> lock(m_stateCompletedMutex);

while (m_state != STATE_COMPLETED)
{
m_waitCondition.wait(lock);

// Use this an example, it could be any code, executed in the waiting thread
qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
}
}

这里的目标是在我们等待工作线程完成时,保持GUI响应(至少响应系统事件,而不是用户输入)。

我对此代码有两个疑问:

1/是执行此操作的好方法,还是“等待时”执行代码的更好方法?

2/“等待代码”(在我的示例中为qApp-> processEvents调用)多久执行一次?是否依赖系统?还是取决于当前的CPU负载或其他?还是我应该使用m_waitCondition。 wait_for 以确保最低频率的通话?

关于第2点,我已经测试过对其进行监视(使用std::chrono::high_resolution_clock),并且在我的应用程序中,延迟似乎介于200毫秒至4000毫秒之间,我认为这是一个很大的范围。

最佳答案

不,这不是正确的方法。您绝不能在Qt(或任何事件驱动的框架)的Main(GUI)线程上等待或 sleep 。

GUI线程必须等待某种事件,而不是等待。如果所有内容都是Qt(即不是某个外部代码无法被Qt行为“污染”),则只需让另一个线程在完成时发出信号即可。

否则,您可以采用user1034749的方法,并将回调传递给计算函数。反过来,该回调既可以设置标志,也可以遵循Qt的事件驱动性质,发出一个信号,沿着您的GUI进行下一步操作(即显示计算结果)。

如果您正在调用ProcessEvents(),则很可能做错了。

关于multithreading - 在等待通知std::condition_variable的过程中执行 “wait callback”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33539279/

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