![](/img/trans.png)
[英]Implement QThread with QProgressBar in PySide (or PyQt) during calculation
[英]How to pass variable to QThread (PySide or PyQT)
我真的很难完成需要几个不同线程的 GUI 应用程序的编写。 在高层次上,我要求:
一个 GUI 线程,它有一个按钮来打开用户选择目录的目录浏览器。 在选择目录时,一个线程开始寻找特定的文件类型。 这可能需要很长时间,所以我知道我需要放入一个单独的 QThread。
然后,一旦该 browseFile 线程完成对文件的搜索,它就会返回一个文件列表,然后将其分块到子文件列表中。 然后将每个子文件列表发送到单独的线程进行处理,这将花费大量时间。
这是我到目前为止编码的内容:
from PyQt4 import QtCore
from PyQt4 import QtGui
from PyQt4.QtCore import *
import os
class BrowseThread(QThread):
processdone = QtCore.pyqtSignal("QString") # Define custom signal.
def __init__(self, parent, *args, **kw):
QThread.__init__(self, parent)
self.search(*args, **kw)
def search(self, directory_path):
self.fileList = []
self.count = 0
for dirname, dirnames, filenames in os.walk(directory_path):
for filename in filenames:
if filename.endswith(".gz"):
self.fileList.append(os.path.join(directory_path,filename))
self.emit( SIGNAL('processdone'), "DONE")
return
class MyClass(QObject):
def __init__(self):
super(MyClass, self).__init__()
directory_path = r'C:\Data'
thread1 = BrowseThread(self, directory_path)
self.connect( thread1, SIGNAL("processdone"), self.thread1done)
thread1.start()
def thread1done(self, text):
print(text)
sys.exit()
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
a = MyClass()
sys.exit(app.exec_())
有没有比使用 *args, **kw 更好的方法将目录路径传递给 browseThread?
如何将 fileList 返回到主线程,然后我可以将其传递给许多新的处理线程。
我确信我做得比它应该更难,所以希望有人能帮助我
谢谢
我建议将您的代码设计更改为具有真正工作的工人类的解决方案。 这个工作类将被移动到一个普通线程中(我不知道 PyQt 但它应该与 C++ 版本非常相似):
class SearchWorker(QObject):
finished_sig = QtCore.pyqtSignal('') # finished signal
def __init__(self, your_stuff):
self.directory_path = ...
def process_slot(self):
# use self.directory_path
# your code
self.emit(SIGNAL('finished_sig'), '')
现在主要部分是将开始信号连接到您的类 MyClass 中的工作人员。 这在 C++ 中给出了这样的东西:
QThread* thread = new QThread;
Worker* worker = new Worker();
worker->moveToThread(thread);
// The start signal will actually launch your search method in the worker
connect(thread, SIGNAL(started()), worker, SLOT(process_slot()));
connect(worker, SIGNAL(finished()), thread, SLOT(quit()));
// May be useless in python
connect(worker, SIGNAL(finished_sig()), worker, SLOT(deleteLater()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
好处是您可以在有或没有线程的情况下使用工作线程,并且可以通过 setter 方法轻松地将参数传递给工作线程。
要了解有关线程的 Qt 信号和插槽的更多信息,我建议您阅读:
您应该能够使用 QT 的信号和槽机制。
http://doc.qt.io/qt-5/threads-qobject.html#signals-and-slots-across-threads
您还可以使用消息传递系统。
将它作为 arg 传递也没有错。 只要确保你安全地做: https : //web.archive.org/web/20150423115746/http : //effbot.org/zone/thread-synchronization.htm
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.