0

假设我有一个事件并调用了相应的函数。此功能与外界交互,因此有时可能会有很长的延迟。如果函数等待或挂起,那么我的 UI 将冻结,这是不可取的。另一方面,必须将我的功能分解成许多部分并重新发出信号很长,并且可能会分解很多代码,这会导致难以调试和可读性降低,并且会减慢开发过程。事件驱动编程中是否有一个特殊功能可以让我只在一个函数调用中编写进程并能够让 mainThread 在等待时完成它的工作?例如,编译器可以识别一个关键字,然后实现一个返回,然后自动重新发出连接到新插槽的信号?为什么我认为这将是一个好主意;)我正在使用 Qt

4

3 回答 3

1

“事件驱动编程中是否有一个特殊功能,可以让我在一个函数调用中编写进程,并能够让 mainThread 在等待时完成它的工作?”

那将是一个非阻塞过程。

但是您最初的查询是,“如何在不冻结 GUI 的情况下在单个插槽中实现阻塞过程?”

也许您正在寻找一种方法来停止其他处理,当某些 - 任何 - 进程决定是时候阻止?通常有很多方法可以做到这一点,是的,通过调用其中一个父对象的方法,当然,这取决于您正在使用的特定对象(例如框架)。

查看父对象并查看它们有哪些您想使用的方法。您可能需要覆盖其中之一以获得您完全想要的结果。

于 2010-01-20T23:43:06.100 回答
1

您的两个选择是线程化,或者以某种方式破坏您的功能。

使用线程,听起来您理想的解决方案是Qt::Concurrent. 如果您的所有处理都已经在一个函数中,并且该函数非常独立(不引用类的成员变量),那么这很容易做到。如果没有,事情可能会变得更复杂一些。

为了分解你的函数,你可以按照你的建议去做,然后把它分解成不同的函数,不同的部分一个接一个地被调用,或者你可以用一种更形象的方式来做,但是分散调用以允许在内部进行其他处理你的功能。我相信调用processEvents()会做你想做的事,但我很长一段时间没有遇到过它的用途。当然,您可能会遇到其他问题,除非您了解它可能会导致您的类的其他部分再次运行(以响应其他事件),因此您必须将它几乎视为多线程来保护变量在计算时有一个不确定的状态。

于 2010-01-21T15:28:32.737 回答
0

如果您想通过开始一个长时间运行的任务来处理 GUI 事件,并且不希望 GUI 等待任务完成,您需要同时执行它,通过创建线程或新进程来执行任务。

如果任务是 I/O 绑定的并且偶尔回调来处理 I/O 就足够了,您可能能够避免创建线程或进程。我不熟悉 Qt 的主循环,但我知道 GTK 支持添加可以集成到select()or poll()-style 循环中的事件源,在超时或文件描述符准备好后运行处理程序。如果这是您的任务,您可以让您的事件处理程序将这样的事件源添加到应用程序的主循环中。

于 2010-01-20T23:41:58.143 回答