を捕まえていない私は、高速キャプチャと処理のために例を取って、キーボード割り込みをキャッチするSIGINTイベントハンドラを追加しました:のpython picamera、キーボードのCtrl + C/SIGINTは<a href="http://picamera.readthedocs.io/en/release-1.12/recipes2.html" rel="nofollow noreferrer">pycamera docs</a>から
import io
import time
import threading
import picamera
# Create a pool of image processors
done = False
lock = threading.Lock()
pool = []
def signal_handler(signal, frame):
global done
print 'You pressed Ctrl+C!'
done=True
sys.exit()
signal.signal(signal.SIGINT, signal_handler)
class ImageProcessor(threading.Thread):
def __init__(self):
super(ImageProcessor, self).__init__()
self.stream = io.BytesIO()
self.event = threading.Event()
self.terminated = False
self.daemon=True;
self.start()
def run(self):
# This method runs in a separate thread
global done
while not self.terminated:
# Wait for an image to be written to the stream
if self.event.wait(1):
try:
self.stream.seek(0)
# Read the image and do some processing on it
#Image.open(self.stream)
#...
#...
# Set done to True if you want the script to terminate
# at some point
#done=True
finally:
# Reset the stream and event
self.stream.seek(0)
self.stream.truncate()
self.event.clear()
# Return ourselves to the pool
with lock:
pool.append(self)
def streams():
while not done:
with lock:
if pool:
processor = pool.pop()
else:
processor = None
if processor:
yield processor.stream
processor.event.set()
else:
# When the pool is starved, wait a while for it to refill
time.sleep(0.1)
with picamera.PiCamera() as camera:
pool = [ImageProcessor() for i in range(4)]
camera.resolution = (640, 480)
camera.framerate = 30
camera.start_preview()
time.sleep(2)
camera.capture_sequence(streams(), use_video_port=True)
# Shut down the processors in an orderly fashion
while pool:
with lock:
processor = pool.pop()
processor.terminated = True
processor.join()
が、割り込み信号があります捕まえられない
camera.capture_sequence(streams(), use_video_port=True)
が実行されるまでは、capture_sequence
が起動された後にシグナルハンドラが呼び出されないため、シグナルがキャッチされます。
私はPythonには新しいので、おそらく答えは簡単です。私はここで間違って何をしていますか?
EDIT:
私は信号が捕捉され、次のコードを削除する場合:あなたのコードで
yield processor.stream
の付録Aであるあなたは、コードの修正について正しいですが、問題はsignal_handler機能が –
ご使用のプラットフォームのWindowsは何と呼ばれることはありませんので、SIGのint型の信号が捕捉されることはありませんでしょうか? Posix? –