用QT中的按钮结束功能

End a function with a button in Qt

本文关键字:结束 功能 按钮 QT      更新时间:2023-10-16

我的函数可以按帧处理视频的框架,而且很长。因此,我决定放置暂停和恢复按钮之类的东西,但我不知道如何使用按钮结束运行功能。我猜想它必须用线程做些事情,但我不知道该怎么做。你能给我一些建议吗?

(注意:我正在命名您的函数processFrameOfvideo()只是为了使其更容易参考下面的参考)

如果processFrameOfvideo()函数在主线程中运行,那么在运行函数时,您的GUI很可能会冻结,因为GUI事件循环直到ProcessFrameSofVideo返回。

如果是这种情况,那么在运行过程fraceframeofvideo()运行时,将GUI取消冻结的快速和差异方法是定期调用qapp-> processevents(例如,从您的内部每50ms或某些东西一次)在ProcessFrameOfvideo()中循环。这将使QT可以在处理视频时以合理及时的方式处理传入的GUI事件(例如鼠标点击),因此例如如果用户在处理视频时调整窗口的大小,则小部件按预期进行调整大小。一旦您有工作,这只是将您的暂停并像往常一样恢复GUI的问题,也许让他们设置一个" pleape_stop_processing"布尔标志,该标志也可以通过ProcessFramesofVideo()的s loop loop定期检查;如果标志为真,则可以提早返回processFrameOfvideo()或等等。

如果您正在寻找比这更优雅的解决方案,另一个选项是产生QThread并在该单独的线程中运行ProcessFrameOfvideo()方法。这将允许ProcessFrameOfvideo()与QT GUI事件循环(尤其是在多核心CPU上)并行真正运行,因此根本不会降低GUI响应能力。ProcessFrameOfvideo()仍然可以使用旧的周期性检查,以了解其是否应暂停或恢复其处理;但是,由于您将涉及多个线程,因此您希望在写入布尔值之前锁定互惠符,然后再解锁sutex,并且您需要在阅读之前让ProcessFrameFvideo()函数锁定相同的rutex布尔值,然后解锁哑光。这将确保CPU的缓存和/或编译器优化不会干扰"看到"彼此的线程变化。