- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 GUI 女巫,我需要使用 Qtimer 不断更新,为此我使用了一个工作 Qthread,这是我的代码:
from PyQt5.QtWidgets import QApplication, QPushButton, QWidget
from PyQt5.QtCore import QThread, QTimer
import sys
import threading
class WorkerThread(QThread):
def run(self):
print("thread started from :" + str(threading.get_ident()))
timer = QTimer(self)
timer.timeout.connect(self.work)
timer.start(5000)
self.exec_()
def work(self):
print("working from :" + str(threading.get_ident()))
QThread.sleep(5)
class MyGui(QWidget):
worker = WorkerThread()
def __init__(self):
super().__init__()
self.initUi()
print("Starting worker from :" + str(threading.get_ident()))
self.worker.start()
def initUi(self):
self.setGeometry(500, 500, 300, 300)
self.pb = QPushButton("Button", self)
self.pb.move(50, 50)
self.show()
app = QApplication(sys.argv)
gui = MyGui()
app.exec_()
Starting worker from :824
thread started from :5916
working from :824
working from :824
最佳答案
答案:在你的情况下,我认为没有必要使用 QThread
.
TL;博士;
我什么时候需要在 GUI 上下文中使用另一个线程?
当某个任务可以阻塞主线程称为GUI线程时,应该只使用一个线程,阻塞是因为任务耗时,导致GUI eventloop无法正常工作。所有现代 GUI 都在一个事件循环中执行,它允许您从键盘、鼠标等操作系统接收通知,还允许您根据用户修改 GUI 的状态。
在你的情况下,我没有看到任何繁重的任务,所以我认为不需要 QThread,我真的不知道你想要定期运行的任务是什么。
假设你有一个消耗大量时间的任务,比如说 30 秒,你必须每半小时做一次,那么线程是必要的。在您的情况下,您想使用 QTimer。
让我们分批进行,QTimer
是一个继承自 QObject
的类, 和 QObject
属于与父级相同的,如果它没有父级,则属于创建它的线程。另一方面,很多时候人们认为 QThread
是Qt的一个线程,但不是,QThread
是一个允许处理本地线程生命周期的类,这在 docs 中有明确说明。 :QThread 类提供了一种与平台无关的方式来 管理线程 .
了解了以上内容,我们来分析一下你的代码:
timer = QTimer(self)
在上面的代码中,self 是 QTimer 的父级,self 是
QThread
, 所以
QTimer
属于
QThread
的父线程或创建 QThread 的地方,而不是创建
QThread
的线程处理。
QThread
被创建:
worker = WorkerThread()
正如我们看到的
QThread
没有父级,则
QThread
属于创建它的线程,即
QThread
属于主线程,因此它的
QTimer
child 也属于主线程。还要注意的是
QThread
的新线程句柄仅具有
run()
的范围method ,如果该方法在别处属于
QThread
所在的字段已创建,以上所有我们看到代码的输出是正确的,并且
QThread.sleep(5)
在主线程上运行导致事件循环崩溃和 GUI 卡住。
QTimer
的父级以便它所属的线程是
run()
之一方法,并在同一方法内移动功函数。另一方面,不必要地创建静态属性是一种不好的做法,考虑到上述结果代码如下:
import sys
import threading
from PyQt5.QtCore import QThread, QTimer
from PyQt5.QtWidgets import QApplication, QPushButton, QWidget
class WorkerThread(QThread):
def run(self):
def work():
print("working from :" + str(threading.get_ident()))
QThread.sleep(5)
print("thread started from :" + str(threading.get_ident()))
timer = QTimer()
timer.timeout.connect(work)
timer.start(10000)
self.exec_()
class MyGui(QWidget):
def __init__(self):
super().__init__()
self.initUi()
self.worker = WorkerThread(self)
print("Starting worker from :" + str(threading.get_ident()))
self.worker.start()
def initUi(self):
self.setGeometry(500, 500, 300, 300)
self.pb = QPushButton("Button", self)
self.pb.move(50, 50)
if __name__ == '__main__':
app = QApplication(sys.argv)
gui = MyGui()
gui.show()
sys.exit(app.exec_())
输出:
Starting worker from :140068367037952
thread started from :140067808999168
working from :140067808999168
working from :140067808999168
观察:
关于python - Qthread 上的 QTimer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52036021/
我想写一些必须在自己的线程中工作的类。我读过这篇文章:http://wiki.qt.io/Threads_Events_QObjects。它建议移动必须在自己的线程中工作的对象,例如: TestCla
在调用所有与 QThread::finished() 信号关联的槽后,QThread::wait() 是否返回(即解除阻塞执行)? 提前致谢。 最佳答案 不,它可能会在与信号 finished() 关
我不是在打电话 exec()在我的代码中,但 timer和 QUdpSocket工作正常。是 exec()用于等待 event接着说? 更新:timer正在工作,因为我没有调用 moveToThrea
如果我创建 QThread 作为局部变量,我发现了一个奇怪的行为。 例如,下面的代码将作为单线程工作,这意味着我需要等待 10 秒,结果才会出来。 但是如果我将线程从局部变量更改为成员变量,它将作为多
I solved my issue by moving the mySubQThread run() into the myQThread run() That said, I still would
一段时间以来,我一直在使用 Qt 开发一个应用程序,在该应用程序中我必须从相机中抓取帧。相机将在与应用程序其余部分不同的线程中运行。我遵循了以下建议: http://mayaposch.wordpre
考虑以下代码片段: class ThreadA::QThread { public: ThreadA() { } void run() { myVariable = n
所以我在构造函数中有以下代码。 m_someObject = new SomeObject(); m_someObject->moveToThread(&m_thread); m_thread.sta
我有 3 个 QThreads 相互调用(全部继承自 QThread。我知道有些人可能建议使用 moveToThread,但暂时忽略这个事实)。简化的代码如下所示: Thread1 类: void T
我想知道 new QThread(this) 和 new QThread() 之间有什么区别,以及这将如何影响我的代码在使用 QThread 时的行为. 最佳答案 QThread 的父级谁执行什么没有
我是 PySide2 的新手。我只是想启动一个示例应用程序并在应用程序启动时启动一个线程,并希望在应用程序关闭时停止该线程。当我关闭应用程序时,我收到以下错误:QThread:在线程仍在运行时销毁。s
关于如何实例化和使用 QThread 的官方文档可以在这里找到: http://doc.qt.io/qt-5/qthread.html 该文档描述了两种基本方法:(1) 工作对象方法和 (2) QTh
我有以下设置: int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // Create the DBM
这是 QTread 的子对象...并在主线程中将其具体化.... 运行时错误如下: ASSERT failure in QCoreApplication::sendEvent: "Cannot sen
在过去的几天里,我一直在尝试使用 QThreads 而不对 QThread 进行子类化的新的首选方法。我遇到的麻烦是当我试图关闭我创建的一组线程时。我经常收到“线程仍在运行时已被销毁”消息(如果我在
我已经创建了这个继承自QThread的类,用于向数据库服务器发送数据,你觉得怎么样?可以改进吗? 谢谢 #ifndef QUERYTHREAD_H#define QUERYTHREAD_H#inclu
我需要在一个线程中进行无限循环。 在 this article作者写道 >you should never ever block the event loop 因为它会阻塞信号槽概念。如何在 QTh
我试图在一个单独的线程中执行一些工作,并在工作完成后停止该线程。 我已经建立了这样的连接 thread.connect( workerClass, SIGNAL( finished() ), SLOT
我有一个快速的问题。我应该创建一个小的多线程程序来从多个传感器获取数据,并且我了解 pthreads 和 qthreads。我可以访问两个图书馆。我个人偏向于使用 Qt,因为它的设计和各种功能。但是,
我需要在主线程上运行 QThread::usleep() (出于各种原因)。 但是,usleep 是受静电保护的。 我想在没有包装器的情况下使用 QThread 的 usleep 函数(我目前正在使用
我是一名优秀的程序员,十分优秀!