程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何使用moveToThread()在pyqt中正确使用QThread?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何使用moveToThread()在pyqt中正确使用QThread??

开发过程中遇到如何使用moveToThread()在pyqt中正确使用QThread?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何使用moveToThread()在pyqt中正确使用QThread?的解决方法建议,希望对你解决如何使用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

解决方法

@H_674_31@

我读了这篇文章《如何真正地,真正地使用QThreads》。完整说明,它说而不是子类qthread和重新实现run(),应使用moveToThread(QThread
*)使用moveToThread将QObject推送到QThread实例上

这是C ++示例,但我不知道如何将其转换为python代码。

class Worker : public QObject
 {
     Q_OBjeCT
     QThread workerThread;

 public slots:
     void doWork(const QString &parameter) {
         // ...
         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,请注明来意。