假设我有一个事件并调用相应的函数。这个功能与外界交互,因此有时可能会有很长的延迟。如果函数等待或挂起,那么我的UI将冻结,这是不可取的。另一方面,不得不将我的功能分解成多个部分并重新发出信号很长,并且可能会破坏很多代码,这些代码很难调试,可读性也会降低,并且会降低开发过程的速度。在事件驱动编程中是否有一个特殊功能,它使我能够在一个函数调用中编写进程,并且能够让mainThread在等待时完成它的工作?例如,编译器可以重新识别关键字,然后实现返回,然后自动重新发出连接到新插槽的信号?为什么我认为这是一个好主意;)我正在使用Qt
答案 0 :(得分:1)
“在事件驱动编程中是否有一个特殊功能,它可以让我在一个函数调用中编写进程,并且能够在等待时让mainThread完成它的工作?”
那将是一个非阻塞的过程。
但您的原始查询是“如何在不冻结GUI的情况下在单个插槽中实现阻止过程?”
也许你正在寻找一种方法来阻止其他处理,当某些 - 任何 - 进程决定它是时候阻止?通常有一些方法可以通过调用其中一个父对象上的方法来实现,当然,这取决于您正在使用的特定对象(例如框架)。
查看父对象,看看他们想要使用哪些方法。您可能需要覆盖其中一个以获得您期望的结果。
答案 1 :(得分:1)
你的两个选择是线程化,或以某种方式破坏你的功能。
使用线程,听起来你理想的解决方案是Qt::Concurrent
。如果您的所有处理都已经在一个函数中,并且该函数是非常独立的(不引用该类的成员变量),那么这很容易做到。如果没有,事情可能会变得更复杂。
为了打破你的功能,你可以按照你的建议去做,把它分成不同的功能,不同的部分一个接一个地调用,或者你可以用更具象征性的方式来做,但散布调用允许你的功能内的其他处理。我相信打电话给processEvents()
会做你想要的,但我很久没见过它了。当然,你可以遇到其他问题,除非你明白它可能会导致你的类的其他部分再次运行(响应其他事件),所以你必须把它当作多线程处理来保护变量你在计算时有一个不确定的状态。
答案 2 :(得分:0)
如果要通过开始长时间运行的任务来处理GUI事件,并且不希望GUI等待任务完成,则需要通过创建线程或新进程来同时执行它执行任务。
如果任务受I / O限制,您可能能够避免创建线程或进程,偶尔回调处理I / O就足够了。我不熟悉Qt的主循环,但我知道GTK支持添加可以集成到select()
或poll()
样式循环中的事件源,在超时或文件描述符之后运行处理程序准备好了。如果那是你的任务,你可以让你的事件处理程序将这样的事件源添加到应用程序的主循环中。