我制作了一个神经网络(不幸的是,它的复杂性已经增加,并且变得相当CPU密集(,它可以实时分析屏幕截图。
我希望在按下字母"a"时暂停它,并在再次按下字母"a"时取消暂停它。暂停它(不完全中断循环(的最有效方法是什么?
它使用Python OpenCV库,但我不使用cv2.imshow,因此我不能使用cv2。等待密钥。我正在Windows 10上运行它。你能提供你的答案的例子代码吗?下面是一些代码:
import cv2
import mss
from PIL import Image
import numpy as np
#Creates an endless loop for high-speed image acquisition...
while (True):
with mss.mss() as sct:
# Get raw pixels from the screen
sct_img = sct.grab(sct.monitors[1])
# Create the Image
img = Image.frombytes('RGB', sct_img.size, sct_img.bgra, 'raw', 'BGRX')
#The rest of the neural network goes here...
#PAUSE statement...
使用 Python 标准库中 signal
包中的sigwait
。 sigwait
不适用于Windows。
编辑
您可以使用threading
库以独立于平台的方式执行所需的操作。下面是一个简短的示例程序(如果您在 Linux 或 Mac 上运行,则需要 py-getch
包(:
import os
from threading import Thread, Event
if os.name=='nt':
from msvcrt import getch
elif os.name=='posix':
from getch import getch
else:
raise OSError
isRunning = True
def count(event):
i = 0
while isRunning:
event.wait(1)
if event.isSet() and isRunning:
event.clear()
print('Pausing count at %d' % i)
event.wait()
print('resuming count')
event.clear()
i += 1
def listener(event):
# in Python, need to mark globals if writing to them
global isRunning
while isRunning:
c = getch()
if c=='a':
event.set()
if c=='e':
event.set()
isRunning = False
def main():
pauseEvent = Event()
pauseEvent.clear()
listenerThread = Thread(target=listener, args=(pauseEvent,))
listenerThread.start()
count(pauseEvent)
if __name__=='__main__':
main()
上面的程序将运行两个线程。主线程将运行 count
函数,该函数每秒将计数加 1。另一个线程运行 listener
函数,该函数将等待用户输入。如果键入 a
,则listener
线程将告诉count
线程暂停并打印出当前计数。您可以再次键入 a
以恢复计数,也可以键入 e
退出。