gpt4 book ai didi

qt - PyQt:通过信号中断qthread

转载 作者:行者123 更新时间:2023-12-04 23:47:20 26 4
gpt4 key购买 nike

我是 pyqt 的新手,所以我希望我尝试做的事情不会有任何奇怪的地方。我试图通过使用 PyQt 信号在 QThreads 之间创建交互。特别是,我想做的是从一个线程发出一个信号,这个信号应该中断线程正在做的事情来运行一个特定的方法。顺便说一下,我在这样做时遇到了一些问题,所以我想知道我尝试做的事情是否合法。

例如,现在我正在尝试做这样的事情:

import sys
import time
from PyQt4 import QtGui as qt
from PyQt4 import QtCore as qtcore
from PyQt4.QtCore import QThread
import threading

app = qt.QApplication(sys.argv)
class widget(qt.QWidget):

def __init__(self, parent=None):
qtcore.QObject.__init__(self)


def appinit(self):
self.mysignal = qtcore.SIGNAL("mysignal")
thread = mythread(self)
thread.start()
time.sleep(5)
print "before emit",str(threading.current_thread())
self.emit(self.mysignal,"hello, I'm thread "+str(threading.current_thread()))
print "after emit",str(threading.current_thread())



class mythread(QThread):
def __init__(self,parent):
qtcore.QThread.__init__(self, parent=app)
self.parent=parent

def run(self):
self.mysignal = qtcore.SIGNAL("mysignal")
self.connect(self.parent, self.mysignal, self.myfunc)
for i in range(15):
print "**",threading.current_thread(),i
time.sleep(1)

def myfunc(self, msg):
print threading.current_thread(), msg, "Enter"
time.sleep(5)
print threading.current_thread(), msg, "Exit"


def main():
mywidget = widget()
mywidget.show()
qtcore.QTimer.singleShot(0, mywidget.appinit)
sys.exit(app.exec_())

main()

我得到的输出是:

** <_DummyThread(Dummy-1, started daemon 1968)> 0
** <_DummyThread(Dummy-1, started daemon 1968)> 1
** <_DummyThread(Dummy-1, started daemon 1968)> 2
** <_DummyThread(Dummy-1, started daemon 1968)> 3
** <_DummyThread(Dummy-1, started daemon 1968)> 4
before emit <_MainThread(MainThread, started 2928)>
<_MainThread(MainThread, started 2928)> hello, I'm thread <_MainThread(MainThread, started 2928)> Enter
** <_DummyThread(Dummy-1, started daemon 1968)> 5
** <_DummyThread(Dummy-1, started daemon 1968)> 6
** <_DummyThread(Dummy-1, started daemon 1968)> 7
** <_DummyThread(Dummy-1, started daemon 1968)> 8
** <_DummyThread(Dummy-1, started daemon 1968)> 9
<_MainThread(MainThread, started 2928)> hello, I'm thread <_MainThread(MainThread, started 2928)> Exit
after emit <_MainThread(MainThread, started 2928)>
** <_DummyThread(Dummy-1, started daemon 1968)> 10
** <_DummyThread(Dummy-1, started daemon 1968)> 11
** <_DummyThread(Dummy-1, started daemon 1968)> 12
** <_DummyThread(Dummy-1, started daemon 1968)> 13
** <_DummyThread(Dummy-1, started daemon 1968)> 14

我实际上希望 mythread 中断它的执行并运行 myfunc。顺便说一句,mythread不会中断它的执行,函数myfunc实际上是由主线程运行的。我尝试执行相反的操作(生成的线程向主线程发送信号)并且成功了。

我想我还没有完全理解信号是如何工作的,以及是否可以做我想做的事情。有什么线索吗?我在网上寻找解决方案,但没有结果。

谢谢

最佳答案

好的,据我所知,您希望线程在进一步迭代之前进入 5 秒 sleep 。

import sys
import time
from PyQt4 import QtGui as qt
from PyQt4 import QtCore as qtcore
from PyQt4.QtCore import QThread
import threading

app = qt.QApplication(sys.argv)
class widget(qt.QWidget):

def __init__(self, parent=None):
qtcore.QObject.__init__(self)


def appinit(self):
self.mysignal = qtcore.SIGNAL("mysignal")
thread = mythread(self,self.mysignal)
thread.start()
time.sleep(5)
print "before emit",str(threading.current_thread())
self.emit(self.mysignal,"hello, I'm thread "+str(threading.current_thread()))
print "after emit",str(threading.current_thread())



class mythread(QThread):
def __init__(self,parent,sig):
qtcore.QThread.__init__(self, parent=app)
self.parent=parent
self.mysignal = sig
self.stop_event=threading.Event()
self.connect(self.parent, self.mysignal, self.setIt)

def run(self):

for i in range(15):
if self.stop_event.isSet():
self.myfunc()
print "**",threading.current_thread(),i
time.sleep(1)

def setIt(self,msg):
self.stop_event.set()
self.msg = msg

def myfunc(self):
print threading.current_thread(),self.msg , "Enter"
time.sleep(5)
print threading.current_thread(),self.msg , "Exit"
self.stop_event.clear()


def main():
mywidget = widget()
mywidget.show()
qtcore.QTimer.singleShot(0, mywidget.appinit)
sys.exit(app.exec_())

main()

输出:

** <_DummyThread(Dummy-1, started daemon 7312)> 0
** <_DummyThread(Dummy-1, started daemon 7312)> 1
** <_DummyThread(Dummy-1, started daemon 7312)> 2
** <_DummyThread(Dummy-1, started daemon 7312)> 3
** <_DummyThread(Dummy-1, started daemon 7312)> 4
before emit <_MainThread(MainThread, started 232)>
after emit <_MainThread(MainThread, started 232)>
<_DummyThread(Dummy-1, started daemon 7312)> hello, I'm thread <_MainThread(MainThread, started 232)> Enter
<_DummyThread(Dummy-1, started daemon 7312)> hello, I'm thread <_MainThread(MainThread, started 232)> Exit
** <_DummyThread(Dummy-1, started daemon 7312)> 5
** <_DummyThread(Dummy-1, started daemon 7312)> 6
** <_DummyThread(Dummy-1, started daemon 7312)> 7
** <_DummyThread(Dummy-1, started daemon 7312)> 8
** <_DummyThread(Dummy-1, started daemon 7312)> 9
** <_DummyThread(Dummy-1, started daemon 7312)> 10
** <_DummyThread(Dummy-1, started daemon 7312)> 11
** <_DummyThread(Dummy-1, started daemon 7312)> 12
** <_DummyThread(Dummy-1, started daemon 7312)> 13
** <_DummyThread(Dummy-1, started daemon 7312)> 14

关于qt - PyQt:通过信号中断qthread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21714845/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com