我希望知道如何暂停一个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.
cancel
的实例变量,并将其设置为False
,然后在 worker 函数中定期检查它。如果主线程想要取消 worker 线程,只需设置该变量self.worker.cancel = True
。当 worker 检查到变量为True
时,应该停止执行。 - Brendan AbelThread
方法,而不是 worker model,但要意识到QThread
实际上存在于主线程中,只有run
函数在单独的线程中执行,因此在线程上创建的任何信号或槽实际上在主线程中运行。如果你需要在主线程和工作线程之间发送数据,通常最好使用 worker model。 - Brendan Abel