我想知道如何暂停一个QThread,然后当我收到信号时继续。我读过并且知道我可以做这样的事情:
def run(self):
...
self.ready=False
while not self.ready:
self.sleep(1)
...
...
@QtCore.Slot()
def set_ready(self):
self.ready = True但是,我想要做的是避免线程中的轮询。我不想把睡眠设定在很短的时间内,继续检查。我想去睡觉,直到我得到一个信号从我的主线程继续。
我在我的帖子里所做的是:
(pseudo code)
with open file:
read a block of data
while data:
sendThread = send the block via UDP
read the next block of data
while not ready or sendThread.isRunning:
sleep(0.1)在我的主线程中,我设置了一个QtNetwork.QUdpSocket来将readyRead连接到一个处理传入数据报并对其进行解码的方法。当它得到我正在等待的响应时,它会向set_ready插槽发送一个信号,告诉线程发送另一个数据报。我并不总是知道其他系统需要多长时间才能做出响应,不过我可能会有30秒左右的时间超时值。
有办法打断线程的睡眠吗?所以我可以做这样的事:
sleep(30)
if not ready:
Timeout occurred stop processing
else:
Continue processing.发布于 2016-05-09 18:34:50
使用使用QThreads的辅助模式可以很容易地做到这一点。在示例文档中有一个QThread。具体的代码会有所不同,取决于您是使用PyQt还是PySide (从示例中看,您使用的是PySide )。
与PyQt相比,PyQt的一个值得注意的问题是QtCore.Q_ARG,因此在PyQt中,您通常可以使用QMetaObject.invokeMethod从主线程调用Worker对象上的一个插槽(带有参数),您不能在PySide中直接这样做,而必须创建一个虚拟信号(即。( Main.send_signal)连接到工作线程上的插槽,这样您就可以从主线程调用它。
import time
import sys
from PySide import QtCore, QtGui
class Worker(QtCore.QObject):
send_signal = QtCore.Signal(str) # using PySide
# QtCore.pyqtSignal(str) ## using PyQt
# @QtCore.pyqtSlot(str)
@QtCore.Slot(str)
def receive_slot(self, data):
# data could be a filepath
# open file
# ... do stuff
# close file
QtCore.QThread.sleep(1) # to simulate doing stuff
self.send_signal.emit(data + ' success')
class Main(QtGui.QWidget):
send_signal = QtCore.Signal(str)
def __init__(self):
super(Main, self).__init__()
self.worker = Worker()
self.thread = QtCore.QThread(self)
self.worker.moveToThread(self.thread)
self.worker.send_signal.connect(self.receive_slot)
self.send_signal.connect(self.worker.receive_slot)
self.thread.start()
self.send_signal.emit('Start')
@QtCore.Slot(str)
def receive_slot(self, data):
print 'Main: {}'.format(data)
self.send_signal.emit('Message {}'.format(time.time()))
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
window = Main()
window.show()
app.exec_()https://stackoverflow.com/questions/37119319
复制相似问题