我有以下代码,它在更新UI上的进度条(progress
)的同时执行后台操作(scan_value
)。 scan_value
迭代obj
中的一些值,每当该值更改时发出一个信号(value_changed
)。由于某些原因,在另一个线程中必须将此封装在对象(Scanner
)中。当单击按钮scan
时,会调用Scanner。这里是我的问题...以下代码可以正常工作(即进度条准确更新)。
# I am copying only the relevant code here.
def update_progress_bar(new, old):
fraction = (new - start) / (stop - start)
progress.setValue(fraction * 100)
obj.value_changed.connect(update_progress_bar)
class Scanner(QObject):
def scan(self):
scan_value(start, stop, step)
progress.setValue(100)
thread = QThread()
scanner = Scanner()
scanner.moveToThread(thread)
thread.start()
scan.clicked.connect(scanner.scan)
但是如果我把最后一部分改成这样:
thread = QThread()
scanner = Scanner()
scan.clicked.connect(scanner.scan) # This was at the end!
scanner.moveToThread(thread)
thread.start()
进度条只有在结束时才会更新(我猜测一切都在同一个线程上运行)。如果我在将接收对象移动到线程之前或之后连接信号到槽中,这是否无关紧要。
progress.setValue(100)
是线程不安全的,因为您正在从主线程以外的线程访问Qt GUI对象。您发布的代码的其余部分在Qt GUI操作方面是线程安全的。 - three_pineapples@pyqtSlot
时会创建某种代理对象,但对于排队连接来说,它会产生什么后果,我并不清楚。 - ekhumoro