- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图让一个按钮启动一个新线程,该线程除了休眠 30 秒之外什么也不做。但是,如果槽是 lambda 函数,则主线程将被阻塞。有谁知道为什么会出现这种情况并且行为不符合我的预期?这是我的代码:
# ...
def setup(self):
# ...
self.pushButton_TestConnection.clicked.connect(self.process)
def process(self):
self.worker_thread = QtCore.QThread()
self.worker = Worker()
self.worker.moveToThread(self.worker_thread)
self.worker_thread.started.connect(lambda: self.worker.sleep(30))
self.worker_thread.start()
class Worker(QtCore.QObject):
def sleep(self, secs):
time.sleep(secs)
与以下内容配合使用效果良好
self.worker_thread.started.connect(self.worker.sleep)
self.worker_thread.start()
class Worker(QtCore.QObject):
def sleep(self):
time.sleep(30)
谢谢
最佳答案
在 Qt 中,执行代码的线程由 thread affinity 决定。接收信号的对象。如果直接从不同的线程调用对象方法,则无论被调用对象的线程关联性如何,该方法都将在调用线程中执行。
Lambda 和其他 Python 可调用对象没有线程亲和性(它们毕竟不是 QObject,这只是 PyQt 的一个很好的功能,允许您将信号连接到任何 Python 可调用对象),因此它们将始终在主(GUI)线程。
因此,在本例中,lambda 是在 GUI 线程中执行的,因此 worker.sleep
调用也将在那里执行,并将阻塞它,直到调用返回。
要实现此功能,您需要将 started
信号直接连接到 Worker 对象的槽,或者使用从 lambda 发出的信号与 Worker 进行通信。
关于python - 如果 .connect 采用 lambda 函数,主线程为何会被阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28623867/
有人可以向我澄清主线 DHT 规范中的声明吗? Upon inserting the first node into its routing table and when starting up th
我正在尝试使用 USB 小工具驱动程序使嵌入式设备作为 MTP 设备工作。 我知道 Android 从大容量存储设备切换到 MTP 设备已经有一段时间了,并且找到了 source code for M
我是一名优秀的程序员,十分优秀!