1

新しいpyqt5シグナルとスロットをスクリプトに適用するのに問題があります。その目的は、解決しようとしている別の問題、GUIのフリーズ/クラッシュをテスト/呼び出すことです...目的は、これらのシグナルとスロットが一度正しく機能していれば、実行時間の +/- 30 秒後に GUI がクラッシュすることはなく、時間の終わりまで数字のカウントを続けます。pyqt5 ソリューションがあれば素晴らしいことですが、pyqt4 の例を提供しました。ありがとう :)

from time import sleep
import os
from PyQt4 import QtCore, QtGui, uic
from PyQt4.QtGui import * 
import random
import os
import time


class Cr(QtCore.QThread):
    def __init__(self):
        QtCore.QThread.__init__(self)
    def run(self):

        while True:
            rndInt = random.randint(1, 100000)
            timesleep = random.random()
            time.sleep(timesleep)
            for i in range(120):
                self.emit(QtCore.SIGNAL('host_UP'), 'foo' + str(rndInt), i)
                QtGui.QApplication.processEvents()


class Main_Window(QWidget):

    def __init__(self, *args): 
        QWidget.__init__(self, *args)
        self.relativePath = os.path.dirname(sys.argv[0])

        self.Main_Window = uic.loadUi("Main_Window.ui", self)
        self.Main_Window.show()
        self.Main_Window.move(790, 300)

        self.GU = []
        ProgressThreads = self.printThreads
        self.details_label = []
        for i in range(120):
            self.details_label.insert(i, 0)
            self.details_label[i] = QLabel(" ")
            ProgressThreads.addWidget(self.details_label[i])
            ProgressThreads.addSpacing(6)
            self.details_label[i].setText(Tools.Trim.Short('Idle', 7))
            self.GU.insert(i, Cr())
            self.GU[i].start()

        self.connect(self.GU, QtCore.SIGNAL("host_UP"), self.UpdateHost)


    def UpdateHost(self, str1, pos1):
        self.details_label[pos1].setText(str1)


class guiUpdate():
    def GUI_main(self):
        self.GUI = GUI



if __name__ == "__main__": 
    app = QApplication(sys.argv)
    guiUpdate.GUI_main.GUI = Main_Window()
    sys.exit(app.exec_())

お手伝いありがとう :)

更新 以下のスクリプトは、上記のスクリプトの正しい PyQt5 バージョンであることを願っています。ただし、クラッシュと「応答なし」メッセージの問題はまだ解決されていません

from time import sleep
import os
from PyQt5 import QtCore, QtGui, uic
from PyQt5.QtWidgets import *
from PyQt5.QtCore import QObject, pyqtSignal
import random
import os
import time
import Tools
import sys


class Cr(QtCore.QThread):
    def __init__(self, sam):
        QtCore.QThread.__init__(self)
        self.sam = sam

    def run(self):

        while True:
            rndInt = random.randint(1, 100000)
            timesleep = random.random()
            time.sleep(timesleep)
            for i in range(5):
                #time.sleep(1)

                self.sam.connect_and_emit_trigger('foo' + str(rndInt), i)
                #self.emit(QtCore.SIGNAL('host_UP'), 'foo' + str(rndInt), i)
                #QtGui.QApplication.processEvents()


class Main_Window(QWidget):

    def __init__(self, *args): 
        QWidget.__init__(self, *args)
        self.relativePath = os.path.dirname(sys.argv[0])

        self.Main_Window = uic.loadUi("Main_Window.ui", self)
        self.Main_Window.show()
        self.Main_Window.move(790, 300)

        sam = Foo()


        self.GU = []
        ProgressThreads = self.ProgressThreads
        self.details_label = []
        for i in range(5):
            self.details_label.insert(i, 0)
            self.details_label[i] = QLabel(" ")
            ProgressThreads.addWidget(self.details_label[i])
            ProgressThreads.addSpacing(6)
            self.details_label[i].setText(Tools.Trim.Short('Idle', 7))
            self.GU.insert(i, Cr(sam))
            self.GU[i].start()


class Foo(QObject):
    # Define a new signal called 'trigger' that has no arguments.
    trigger = pyqtSignal()
    def connect_and_emit_trigger(self, str, i):
        self.str = str
        self.i = i

        self.trigger.connect(self.handle_trigger)
        self.trigger.emit()

    def handle_trigger(self):
        guiUpdate.GUI_main.GUI.details_label[self.i].setText(self.str)




class guiUpdate():
    def GUI_main(self):
        self.GUI = GUI



if __name__ == "__main__": 
    app = QApplication(sys.argv)
    guiUpdate.GUI_main.GUI = Main_Window()
    sys.exit(app.exec_())
4

2 に答える 2

0

スレッドを使用する新しい推奨方法 (および私が最良の結果を得た方法) は、moveToThread()QThread を直接サブクラス化する代わりに使用することです。要するに:

  1. 実際の作業を行う QObject サブクラスを作成します (QMyWorker と呼びましょう)。start()これは、またはrun()メソッドなどを使用して、既存の qthread サブクラスに少し似ている可能性があります。

  2. QMyWorker の親のないインスタンスを作成する

  3. QThread の親のないインスタンスを作成する

  4. 使用しますQMyWorker.moveToThread(your_thread_instance)(私は記憶に頼っています。ドキュメントでAPIを再確認してください)。

  5. あなたに電話するQMyWorker.start()

このアプローチは、非常に長いジョブ (4GB ファイルなど) でうまくいきました。

于 2016-06-08T15:32:27.733 に答える
0

QThreadPool、QRunnable をワーカーと共に使用すると、スレッドごとにより多くのワーカーを作成できます。ここに説明がある非常に良い例 https://martinfitzpatrick.name/article/multithreading-pyqt-applications-with-qthreadpool/

私のPYQT5もフリーズしていましたが、TimeStampを印刷して微調整しました

于 2018-07-23T09:05:22.170 に答える