在我的程序中,我想不断地将文本设置到文本浏览器中,但当我单击另一个按钮时,它似乎有延迟。我的密码是:
class Ui_MainWindow(QWidget):
def __init__(self):
QWidget.__init__(self)
self.setupUi(self)
self.th0 = TestThread()
self.pushButton.clicked.connect(self.runthread)
def runthread(self):
self.th0.start()
self.chilWid.Consumer()
QtGui.qApp.processEvents()
def setupUi(self, Widget):
self.gridLayout = QtGui.QGridLayout()
self.pushButton = QtGui.QPushButton()
self.gridLayout.addWidget(self.pushButton, 0, 0, 1, 1)
self.chilWid = ChildWid()
self.gridLayout.addWidget(self.chilWid, 1, 0, 1, 1)
self.setLayout(self.gridLayout)
manager = Manager()
manager2 = Manager()
q = manager.Queue()
q2 =manager2.Queue()
l = manager.Lock()
l2 =manager2.Lock()
这个类是一个线程,它将控制生产者
^{pr2}$这个类只包含一个文本浏览器,将由类MainWindow插入。它还从队列中收集数据并显示在文本浏览器上
class ChildWid(QWidget):
def __init__(self):
QWidget.__init__(self)
self.text = QTextEdit()
self.lay = QHBoxLayout(self)
self.lay.addWidget(self.text)
def Consumer(self):
global q, q2, q3,l,l2,l3
while True:
try:
task = q.get(block=False)
QtGui.qApp.processEvents()
self.text.setText(str(task))
except:
pass
当我单击pushButton
时,文本浏览器将正常显示由Producer
生成的文本。但另一个按钮如pushbutton
或整个用户界面的响应非常慢。对我有什么建议吗?谢谢
**********新更新
class TestThread(QThread,QObject):
testsinal = pyqtSignal(str)
def __init__(self):
. . .
self.t = ChildWid()
def TestSignal(self):
self.testsinal.emit('some text message')
self.testsinal.connect(self.handle)
@QtCore.pyqtSlot(str)
def handle(self,str):
print str
self.t.text.setText(str)
def run(self):
print"Thread run normally"
while (self.stopped):
ps0 = Process(target=L2PS_v1a4.main, args=(q, l, 'eth0', q2, l2, q3))
ps0.start()
self.TestSignal()
带有阻塞
while
循环的Consumer
方法看起来真的很讨厌。它试图表现得像某种假事件循环,但它不可能像真的那样高效地运行。把它扔掉。在正确的方法是在
TestThread
类上定义一个自定义信号,然后使用它从run()
方法中发出文本消息。跨线程信号是线程安全的,并被发送到接收线程的事件队列中。这意味着它们是异步处理的,因此不会阻塞GUI:相关问题 更多 >
编程相关推荐