大佬教程收集整理的这篇文章主要介绍了如何使用moveToThread()在pyqt中正确使用QThread?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
QThread中的默认run()实现为您运行一个事件循环,等效于:
class GenericThread(QThread):
def run(self, *args):
self.exec_()
事件循环的重要之处在于,它允许线程 对象在其插槽上接收事件,这些事件将 执行。这些对象只是QObject,而不是QThreads。
重要说明:QThread对象 !它是在主线程上创建的,并在那里存在。除了其run方法之外,所有代码都在主线程中执行。
因此,您应该可以执行以下操作:
class GenericWorker(QObject):
def __init__(self, function, *args, **kwargs):
super(GenericWorker, self).__init__()
self.function = function
self.args = args
self.kwargs = kwargs
self.start.connect(self.run)
start = pyqtSignal(str)
@pyqtSlot
def run(self, some_String_arg):
self.function(*self.args, **self.kwargs)
my_thread = QThread()
my_thread.start()
# This causes my_worker.run() to eventually execute in my_thread:
my_worker = GenericWorker(...)
my_worker.movetoThread(my_thread)
my_worker.start.emit("Hello")
另外,请仔细考虑self.function
当前已丢弃的结果的结果。您可以在上声明另一个信号GenericWorker
,该信号接收结果,并让run()
方法在完成后发出该信号,并将结果传递给它。
http://ilearnstuff.blogspot.co.uk/2012/09/qthread-best-practices-when- qthread.HTML
我读了这篇文章《如何真正地,真正地使用QThreads》。完整说明,它说而不是子类qthread和重新实现run(),应使用moveToThread(QThread
*)使用moveToThread将QObject推送到QThread实例上
这是C ++示例,但我不知道如何将其转换为python代码。
class Worker : public QObject
{
Q_OBjeCT
QThread workerThread;
public slots:
void doWork(const QString ¶meter) {
// ...
emit resultReady(result);
}
signals:
void resultReady(const QString &result);
};
class Controller : public QObject
{
Q_OBjeCT
QThread workerThread;
public:
Controller() {
Worker *worker = new Worker;
worker->moveToThread(&workerThread);
connect(workerThread,SIGNAL(finished()),worker,SLOT(deleteLater()));
connect(this,SIGNAL(operate(QString)),SLOT(doWork(QString)));
connect(worker,SIGNAL(resultReady(QString)),this,SLOT(handleResults(QString)));
workerThread.start();
}
~Controller() {
workerThread.quit();
workerThread.wait();
}
public slots:
void handleResults(const QString &);
signals:
void operate(const QString &);
};
QThread* thread = new QThread;
Worker* worker = new Worker();
worker->moveToThread(thread);
connect(worker,SIGNAL(error(QString)),SLOT(errorString(QString)));
connect(thread,SIGNAL(started()),SLOT(process()));
connect(worker,thread,SLOT(quit()));
connect(worker,SLOT(deleteLater()));
connect(thread,SLOT(deleteLater()));
thread->start();
我一直在使用这种方法来生成qthread,但是如您所见,它使用的是不推荐的方式。我如何重写它以使用首选方法?
class GenericThread(QThread):
def __init__(self,function,*args,**kwargs):
QThread.__init__(self)
# super(GenericThread,self).__init__()
self.function = function
self.args = args
self.kwargs = kwargs
def __del__(self):
self.wait()
def run(self,*args):
self.function(*self.args,**self.kwargs)
编辑:两年后&Hellip;我尝试了qris的代码,它的工作原理和不同的线程
import sys
import time
from PyQt4 import QtCore,QtGui
from PyQt4.QtCore import pyqtSignal,pyqtSlot
import threading
def logthread(caller):
print('%-25s: %s,%s,' % (caller,threading.current_thread().name,threading.current_thread().ident))
class MyApp(QtGui.QWidget):
def __init__(self,parent=NonE):
QtGui.QWidget.__init__(self,parent)
self.setGeometry(300,300,280,600)
self.setWindowtitle('using threads')
self.layout = QtGui.QVBoxLayout(self)
self.TESTButton = QtGui.QPushButton("QThread")
self.TESTButton.released.connect(self.test)
self.listwidget = QtGui.QListWidget(self)
self.layout.addWidget(self.TESTButton)
self.layout.addWidget(self.listwidget)
self.threadPool = []
logthread('mainwin.__init__')
def add(self,text):
""" Add item to list widget """
logthread('mainwin.add')
self.listwidget.addItem(text)
self.listwidget.sortItems()
def addBatch(self,text="test",iters=6,delay=0.3):
""" Add several items to list widget """
logthread('mainwin.addBatch')
for i in range(iters):
time.sleep(delay) # artificial time delay
self.add(text+" "+str(i))
def test(self):
my_thread = QtCore.QThread()
my_thread.start()
# This causes my_worker.run() to eventually execute in my_thread:
my_worker = GenericWorker(self.addBatch)
my_worker.moveToThread(my_thread)
my_worker.start.emit("Hello")
# my_worker.finished.connect(self.xxX)
self.threadPool.append(my_thread)
self.my_worker = my_worker
class GenericWorker(QtCore.QObject):
start = pyqtSignal(str)
finished = pyqtSignal()
def __init__(self,**kwargs):
super(GenericWorker,self).__init__()
logthread('GenericWorker.__init__')
self.function = function
self.args = args
self.kwargs = kwargs
self.start.connect(self.run)
@pyqtSlot()
def run(self,**kwargs):
logthread('GenericWorker.run')
self.function(*self.args,**self.kwargs)
self.finished.emit()
# run
app = QtGui.QApplication(sys.argv)
test = MyApp()
test.show()
app.exec_()
输出是:
@H_203_5@mainwin.__init__ : MainThread,140221684574016,GenericWorker.__init__ : MainThread,GenericWorker.run : Dummy-1,140221265458944,mainwin.addBatch : Dummy-1,mainwin.add : Dummy-1,
以上是大佬教程为你收集整理的如何使用moveToThread()在pyqt中正确使用QThread?全部内容,希望文章能够帮你解决如何使用moveToThread()在pyqt中正确使用QThread?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。