我的程序的主线程(函数main在其中)保留用于非GUI任务。它调用了许多耗时的计算函数。所有已实现的GUI都在单独的线程中完成其工作。
我现在将使用Qt实现另一个GUI。Qt文档表示所有与GUI相关的任务都应在主线程中完成。 在我的情况下,在主线程中插入偶尔的QCoreApplication::processEvents()调用几乎是无用的,因为它们之间存在很大的延迟。
有没有办法克服Qt的这个限制? 在Qt程序的主线程中是否不可能执行任何与非GUI相关的操作?
我的程序的主线程(函数main在其中)保留用于非GUI任务。它调用了许多耗时的计算函数。所有已实现的GUI都在单独的线程中完成其工作。
我现在将使用Qt实现另一个GUI。Qt文档表示所有与GUI相关的任务都应在主线程中完成。 在我的情况下,在主线程中插入偶尔的QCoreApplication::processEvents()调用几乎是无用的,因为它们之间存在很大的延迟。
有没有办法克服Qt的这个限制? 在Qt程序的主线程中是否不可能执行任何与非GUI相关的操作?
QCoreApplication::processEvents()
有一种可行的解决方法,但听起来你无法让它为你工作。QThread
,QMutex
,QWaitCondition
等将任务委派给线程池而自己编写系统,但是最近的Qt版本通过更高级别的抽象(如QThreadPool
,QtConcurrent :: run
和QFuture
)使事情变得更加容易。在Qt的文档中,"main thread" 的概念并没有明确定义。实际上,一个进程的主线程(执行 Process.run 函数的进程)可能与Qt的主线程(首个实例化的Qt对象,如 QApplication)不同,尽管这两个 "main" 线程通常是相同的。
以下是一个有效代码结构的示例:
下面的函数将在进程的非主线程 'thread-1' 中运行,并且会立即成为Qt的主线程。
def startThread1():
app = QApplication(sys.argv)
app.exec_() # enter event loop
以下代码在进程的主线程中运行,不要与进程的主Qt和唯一GUI线程混淆。
thread1 = Thread(target=self.startThread1)
thread1.start()
input('I am busy until you press enter')
如果你从另一个线程调用 QApplication::exec(),然后它变成了你的 GUI 线程,我不确定事情会如何进行。只是一个想法。
(如果有效,请告诉我们,这将很有趣...)