gpt4 book ai didi

c++ - 在 Qt 中用按钮结束一个函数

转载 作者:行者123 更新时间:2023-11-28 02:54:38 25 4
gpt4 key购买 nike

我有一个逐帧处理视频帧的函数,它很长。所以我决定放置类似暂停和恢复按钮的东西,但我不知道如何使用按钮结束正在运行的功能。我猜它必须用线程做一些事情,但我不知道该怎么做。你能给我一些建议吗?

最佳答案

(注意:我将您的函数命名为 ProcessFramesOfVideo() 只是为了更容易在下面引用)

如果 ProcessFramesOfVideo() 函数在您的主线程中运行,那么您的 GUI 很可能会在该函数运行时卡住,因为 GUI 事件循环在 ProcessFramesOfVideo 返回之前不会运行。

如果是这种情况,那么在 ProcessFramesOfVideo() 运行时解冻 GUI 的快速而肮脏的方法是从在 ProcessFramesOfVideo() 中循环。这将允许 Qt 在处理视频时以合理及时的方式处理传入的 GUI 事件(如鼠标点击),例如如果用户在处理视频时调整窗口大小,小部件将按预期调整大小。一旦你开始工作,那么就像往常一样将你的暂停和恢复按钮放在 GUI 中,也许让它们设置一个“please_stop_processing” bool 标志,该标志也由 ProcessFramesOfVideo() 的循环定期检查;如果标志为真,ProcessFramesOfVideo() 可以提前返回,等等。

如果您正在寻找比这更优雅的解决方案,另一个选择是生成一个 QThread 并在该单独的线程中运行 ProcessFramesOfVideo() 方法。这将允许 ProcessFramesOfVideo() 真正与 Qt GUI 事件循环并行运行(尤其是在多核 CPU 上),这样 GUI 响应速度就不会降低。 ProcessFramesOfVideo() 仍然可以使用旧的周期性 bool 检查技术来了解是否应该暂停或恢复其处理;但是由于涉及多个线程,因此您希望 GUI 线程在写入 bool 值之前锁定互斥锁,然后再解锁互斥锁,并且您希望 ProcessFramesOfVideo() 函数在读取之前锁定同一个互斥锁 bool 值,然后解锁互斥量。这将确保 CPU 的缓存和/或编译器优化不会干扰线程“看到”彼此对 bool 标志的更改。

关于c++ - 在 Qt 中用按钮结束一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22277908/

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