使用 QThread 正确显示线程 ID
Correctly display thread ID with QThread
我正在尝试使用 QThread 正确显示线程的 ID,但我得到了一些令人困惑的结果。
我已经读过这篇文章:PyQt: Connecting a signal to a slot to start a background operation,但它涵盖了有关插槽和信号的特定问题。不是这种情况。我对插槽连接顺序不感兴趣,重点实际上是了解特定线程中代码的哪一部分是 运行。
请考虑以下代码:
from PyQt5.QtCore import QObject, QThread, pyqtSignal
class Worker(QObject):
started = pyqtSignal()
finished = pyqtSignal()
def __init__(self, message):
super(Worker, self).__init__()
self.message = message
def process(self, message):
i = 0
cicle = 10000
j = 0
while j < 5:
i = i + 1
if i % cicle == 0:
j = float(i/cicle)
print(message, j)
print("Worker", int(QThread.currentThread().currentThreadId()))
self.finished.emit()
worker1 = Worker("Worker 1:")
thread1 = QThread()
thread1.started.connect(lambda: worker1.process(worker1.message))
worker1.finished.connect(thread1.quit)
worker1.finished.connect(worker1.deleteLater)
thread1.finished.connect(thread1.deleteLater)
worker1.moveToThread(thread1)
print("Main app:", int(QThread.currentThread().currentThreadId()))
thread1.start()
我得到以下信息:
Main App: 13420
Worker 1: 1.0
Worker 1: 2.0
Worker 1: 3.0
Worker 1: 4.0
Worker 1: 5.0
Worker 13420
我想知道为什么第一行和最后一行显示相同的整数 ID:为什么如果我将 worker1 移到另一个线程中,我会得到相同的结果?
编辑:
我再次编辑此问题以(再次)说明问题不在连接顺序中。我试过这个代码:
class Worker(QObject):
started = pyqtSignal()
finished = pyqtSignal()
def __init__(self, message):
super(Worker, self).__init__()
self.message = message
def process(self, message):
i = 0
cicle = 10000
j = 0
while j < 5:
i = i + 1
if i % cicle == 0:
j = float(i/cicle)
print(message, j)
# print(int(QThread.currentThread().currentThreadId()))
print("Worker", int(QThread.currentThread().currentThreadId()))
self.finished.emit()
worker1 = Worker("Worker 1:")
thread1 = QThread()
worker1.moveToThread(thread1)
print("Main app:", int(QThread.currentThread().currentThreadId()))
thread1.started.connect(lambda: worker1.process(worker1.message))
worker1.finished.connect(thread1.quit)
worker1.finished.connect(worker1.deleteLater)
thread1.finished.connect(thread1.deleteLater)
thread1.start()
结果相同
如果网站不够好,请随时编辑问题,感谢您提出任何建议。
下面是一个完整的示例。请注意,这使用 pyqtSlot
装饰器来解决问题。如果该行被注释掉,则该示例将不再有效,因为工作线程在 槽连接后 移动到线程。
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class Worker(QObject):
started = pyqtSignal()
finished = pyqtSignal()
def __init__(self, message):
super(Worker, self).__init__()
self.message = message
@pyqtSlot()
def process(self):
i = 0
cicle = 10000
j = 0
while j < 5:
i = i + 1
if i % cicle == 0:
j = float(i/cicle)
print(self.message, j)
print("Worker", int(QThread.currentThread().currentThreadId()))
self.finished.emit()
app = QApplication(['test'])
worker1 = Worker("Worker 1:")
thread1 = QThread()
print("Main app:", int(QThread.currentThread().currentThreadId()))
thread1.started.connect(worker1.process)
worker1.finished.connect(thread1.quit)
worker1.finished.connect(worker1.deleteLater)
thread1.finished.connect(app.quit)
worker1.moveToThread(thread1)
thread1.start()
app.exec_()
好的,
我发现问题出在 lambda 函数中。只需将其删除即可解决问题。连接顺序不影响输出。这是工作示例:
from PyQt5.QtCore import QObject, QThread, pyqtSignal
class Worker(QObject):
started = pyqtSignal()
finished = pyqtSignal()
def __init__(self, message):
super(Worker, self).__init__()
self.message = message
def process(self, message):
i = 0
cicle = 10000
j = 0
while j < 5:
i = i + 1
if i % cicle == 0:
j = float(i/cicle)
print(message, j)
print("Worker", int(QThread.currentThread().currentThreadId()))
self.finished.emit()
worker1 = Worker("Worker 1:")
thread1 = QThread()
thread1.started.connect(worker1.process(worker1.message))
worker1.finished.connect(thread1.quit)
worker1.finished.connect(worker1.deleteLater)
thread1.finished.connect(thread1.deleteLater)
worker1.moveToThread(thread1)
print("Main app:", int(QThread.currentThread().currentThreadId()))
thread1.start()
输出:
Main App: 11624
Worker 1: 1.0
Worker 1: 2.0
Worker 1: 3.0
Worker 1: 4.0
Worker 1: 5.0
Worker 12552
新用户绝对没有办法从这里接受的答案推导出这个解决方案:PyQt: Connecting a signal to a slot to start a background operation .
我正在尝试使用 QThread 正确显示线程的 ID,但我得到了一些令人困惑的结果。
我已经读过这篇文章:PyQt: Connecting a signal to a slot to start a background operation,但它涵盖了有关插槽和信号的特定问题。不是这种情况。我对插槽连接顺序不感兴趣,重点实际上是了解特定线程中代码的哪一部分是 运行。
请考虑以下代码:
from PyQt5.QtCore import QObject, QThread, pyqtSignal
class Worker(QObject):
started = pyqtSignal()
finished = pyqtSignal()
def __init__(self, message):
super(Worker, self).__init__()
self.message = message
def process(self, message):
i = 0
cicle = 10000
j = 0
while j < 5:
i = i + 1
if i % cicle == 0:
j = float(i/cicle)
print(message, j)
print("Worker", int(QThread.currentThread().currentThreadId()))
self.finished.emit()
worker1 = Worker("Worker 1:")
thread1 = QThread()
thread1.started.connect(lambda: worker1.process(worker1.message))
worker1.finished.connect(thread1.quit)
worker1.finished.connect(worker1.deleteLater)
thread1.finished.connect(thread1.deleteLater)
worker1.moveToThread(thread1)
print("Main app:", int(QThread.currentThread().currentThreadId()))
thread1.start()
我得到以下信息:
Main App: 13420
Worker 1: 1.0
Worker 1: 2.0
Worker 1: 3.0
Worker 1: 4.0
Worker 1: 5.0
Worker 13420
我想知道为什么第一行和最后一行显示相同的整数 ID:为什么如果我将 worker1 移到另一个线程中,我会得到相同的结果?
编辑: 我再次编辑此问题以(再次)说明问题不在连接顺序中。我试过这个代码:
class Worker(QObject):
started = pyqtSignal()
finished = pyqtSignal()
def __init__(self, message):
super(Worker, self).__init__()
self.message = message
def process(self, message):
i = 0
cicle = 10000
j = 0
while j < 5:
i = i + 1
if i % cicle == 0:
j = float(i/cicle)
print(message, j)
# print(int(QThread.currentThread().currentThreadId()))
print("Worker", int(QThread.currentThread().currentThreadId()))
self.finished.emit()
worker1 = Worker("Worker 1:")
thread1 = QThread()
worker1.moveToThread(thread1)
print("Main app:", int(QThread.currentThread().currentThreadId()))
thread1.started.connect(lambda: worker1.process(worker1.message))
worker1.finished.connect(thread1.quit)
worker1.finished.connect(worker1.deleteLater)
thread1.finished.connect(thread1.deleteLater)
thread1.start()
结果相同
如果网站不够好,请随时编辑问题,感谢您提出任何建议。
下面是一个完整的示例。请注意,这使用 pyqtSlot
装饰器来解决问题。如果该行被注释掉,则该示例将不再有效,因为工作线程在 槽连接后 移动到线程。
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class Worker(QObject):
started = pyqtSignal()
finished = pyqtSignal()
def __init__(self, message):
super(Worker, self).__init__()
self.message = message
@pyqtSlot()
def process(self):
i = 0
cicle = 10000
j = 0
while j < 5:
i = i + 1
if i % cicle == 0:
j = float(i/cicle)
print(self.message, j)
print("Worker", int(QThread.currentThread().currentThreadId()))
self.finished.emit()
app = QApplication(['test'])
worker1 = Worker("Worker 1:")
thread1 = QThread()
print("Main app:", int(QThread.currentThread().currentThreadId()))
thread1.started.connect(worker1.process)
worker1.finished.connect(thread1.quit)
worker1.finished.connect(worker1.deleteLater)
thread1.finished.connect(app.quit)
worker1.moveToThread(thread1)
thread1.start()
app.exec_()
好的,
我发现问题出在 lambda 函数中。只需将其删除即可解决问题。连接顺序不影响输出。这是工作示例:
from PyQt5.QtCore import QObject, QThread, pyqtSignal
class Worker(QObject):
started = pyqtSignal()
finished = pyqtSignal()
def __init__(self, message):
super(Worker, self).__init__()
self.message = message
def process(self, message):
i = 0
cicle = 10000
j = 0
while j < 5:
i = i + 1
if i % cicle == 0:
j = float(i/cicle)
print(message, j)
print("Worker", int(QThread.currentThread().currentThreadId()))
self.finished.emit()
worker1 = Worker("Worker 1:")
thread1 = QThread()
thread1.started.connect(worker1.process(worker1.message))
worker1.finished.connect(thread1.quit)
worker1.finished.connect(worker1.deleteLater)
thread1.finished.connect(thread1.deleteLater)
worker1.moveToThread(thread1)
print("Main app:", int(QThread.currentThread().currentThreadId()))
thread1.start()
输出:
Main App: 11624
Worker 1: 1.0
Worker 1: 2.0
Worker 1: 3.0
Worker 1: 4.0
Worker 1: 5.0
Worker 12552
新用户绝对没有办法从这里接受的答案推导出这个解决方案:PyQt: Connecting a signal to a slot to start a background operation .