
我首先尝试使GUI在与应用程序不同的进程中运行.但我很快后悔那个实验.在两个进程之间建立通信链接远非微不足道.所以我决定现在多线程都很好(尽管Python Global Interpreter Lock使它们在单核上运行).
MainThread完全掌握在Qt GUI的手中.显然这是标准做法.因此,让我们假设软件的整体结构应如下所示(请注意,qtThread与MainThread同义):
我的应用程序代码在appThread中运行 – 与GUI完全分开.但在某些时候,必须有互动.
我已经阅读了许多关于如何组织这篇文章的文章,但许多来源相互矛盾.根据许多人的说法,即使官方的Qt应用程序也是错误的(官方文档鼓励将QThread子类化).我能找到的最具启发性的文章是这些:
http://ilearnstuff.blogspot.be/2012/08/when-qthread-isnt-thread.html
http://ilearnstuff.blogspot.be/2012/09/qthread-best-practices-when-qthread.html
即使在考虑了所有这些之后,我仍然对几件事情保持怀疑.
问题1.启动appThread最合适的方法是什么?
启动appThread最合适的方法是什么?如果我错了,请纠正我,但我相信有两种选择:
选择1:启动标准Python线程
Python提供了可以导入以生成新线程的线程库:
import threadingif __name__ == '__main__': # 1. Create the qt thread (is MainThread in fact) qtApp = QApplication(sys.argv) QApplication.setStyle(qstyleFactory.create('Fusion')) # 2. Create the appThread appThread = threading.Thread(name='appThread',target=appThreadFunc,args=(p1,p2,)) appThread.start() # 3. Start the qt event loop qtApp.exec_() print('Exiting program') 这个选择对我来说看起来最干净.您甚至可以在不考虑GUI的情况下真正编写appThread代码.毕竟,您正在使用标准的Python线程库.那里没有Qt的东西.
但我找不到关于在appThread和MainThread之间建立通信链接的明确文档.更多关于第二个问题中的问题..
选择2:启动QThread线程
这个选择看起来不那么干净,因为你不得不乱用Qt来编写你的应用程序代码.无论如何,它看起来像一个可行的选择,因为两个线程之间的通信链接 – appThread和MainThread – 可能更好地支持.
有很多方法可以启动QThread线程.鼓励官方Qt文档继承QThread并重新实现run()方法.但我读到这种做法实际上非常糟糕.请参阅我在问题开头发布的两个链接的更多信息.
问题2.两个线程之间最好的通信链接是什么?
两个线程之间最好的通信链接是什么?显然,这个问题的答案在很大程度上取决于问题1中的选择.我可以想象将标准Python线程链接到GUI与链接QThread有很大不同.
我会留给你提出建议,但我脑海中浮现的一些机制是:
>队列:使用标准的Python队列或Qt队列?
>信号/插槽机制:……
>插座:应该工作,但看起来有点麻烦
>管道:……
>临时文件:繁琐
备注:
如果您的答案适用于Python 2.x或3.x,请提及.还要记住,在谈论线程,队列等时,可能会很快出现混淆.如果您引用标准Python线程或QThread,标准Python队列或QQueue,请提及……
解决方法 我建议做的是做大多数人做的事.等到有需要在单独的线程中运行的代码,然后只将那段代码放在一个线程中.您的代码不需要在单独的线程中以实现良好的代码分离.我会这样做的方式如下:在只具有非GUI库知识的基类中拥有您的appThread代码(不了解GUI的代码).这样,以后也可以轻松支持代码的命令行版本.将需要执行的代码异步执行到此基类的常规Python线程中.确保您想要异步执行的代码只是一个函数调用,以便我的下一个点更容易.
然后,将一个子类放在一个单独的文件中,该文件继承了刚刚编写的基类和QMainWindow类.您需要异步运行的任何代码都可以通过QThread类调用.如果您在上面提到的一个函数调用中创建了想要异步运行的代码,那么很容易让这个步骤适用于您的QThread子类.
为什么以上呢?
它使管理状态和通信变得更加容易.为什么在没有必要的情况下让自己变得疯狂的竞争条件和线程沟通?对于应用程序代码与GUI代码,在GUI中使用单独的线程也没有性能原因,因为大多数时候用户实际上并没有输入太多cpu.只有缓慢的部分才能放入线程中,既可以节省成本,又可以简化代码管理.另外,使用Python,由于GIL,你不会从单独的线程获得任何东西.
总结以上是内存溢出为你收集整理的应用程序线程和Qt线程之间的清晰分离(Python – PyQt)全部内容,希望文章能够帮你解决应用程序线程和Qt线程之间的清晰分离(Python – PyQt)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)