正如前面所说,要使用QThread开始一个线程,我们可以创建它的一个子类,然后覆盖其QThread.run()函数:
class Thread(QThread): def __init__(self): super(Thread,self).__init__() def run(self): pass #线程相关代码
thread=Thread() thread.start()这个默认实现其实是简单地调用了QThread.exec()函数,而这个函数,按照我们前面所说的,其实是开始了一个事件循环
class Task(QRunnable): def __init__(self): super(QRunnable,self).__init__() def run(self): pass #线程相关代码要真正执行一个QRunnable对象,我们需要使用QThreadPool类。顾名思义,这个类用于管理一个线程池。通过调用QThreadPool.start(runnable)函数,我们将一个QRunnable对象放入QThreadPool的执行队列。一旦有线程可用,线程池将会选择一个QRunnable对象,然后在那个线程开始执行。所有 PyQt 应用程序都有一个全局线程池,我们可以使用QThreadPool.globalInstance()获得这个全局线程池;与此同时,我们也可以自己创建私有的线程池,并进行手动管理。
task=Task() QThreadPool.globalInstance().start(task)需要注意的是,QRunnable不是一个QObject,因此也就没有内建的与其它组件交互的机制。为了与其它组件进行交互,你必须自己编写低级线程原语,例如使用 mutex 守护来获取结果等。
特性 |
QThread |
QRunnable |
QtConcurrent |
高级 API | ? | ? | ? |
面向任务 | ? | ? | ? |
内建对暂停/恢复/取消的支持 | ? | ? | ? |
具有优先级 | ? | ? | ? |
可运行事件循环 | ? | ? | ? |
原文地址:http://blog.csdn.net/a359680405/article/details/45225605