スレッド化モジュールまたはマルチプロセッシング モジュールを PySpin と共に使用して、4 台の FLIR Blackfly S USB3 カメラから画像を記録しています。プライマリ カメラは「開始」ハードウェア信号で画像の収集を開始し、3 台のセカンダリ カメラはプライマリ カメラの画像キャプチャにハードウェア同期されます。
この構成と以下のサンプル コードを使用して、各スレッドはimage_result = cam.GetNextImage()行で画像が利用可能になるのを待ちます。開始信号が到着すると、カメラは画像のキャプチャを開始し、スレッドは画像を取得して無期限に実行します。
threads = []
for camNum, cam in enumerate(cams):
threads.append(threading.Thread(target = image_thread, args = (cam, camNum+1)))
for t in threads:
t.start()
time.sleep(1)
for t in threads:
print('about to join')
t.join()
def image_thread(cam, cam_num):
record = True
while record:
try:
print('about to grab for: ' + str(cam_num))
image_result = cam.GetNextImage()
print('image grabbed')
threading.Thread のすべてのインスタンスを multiprocessing.Process に置き換えると、コードはimage_result = cam.GetNextImage()でハングし、開始信号が到着しても画像の収集を開始しません。どちらの場合も、開始シグナルを受信する前の端末出力は次のようになり、4 つのスレッド/プロセスすべてがその行に到達し、シグナルを待機していることを示します。
about to grab for: 1
about to grab for: 2
about to grab for: 3
about to grab for: 4
about to join
最終的にプロセスを便利に終了できるように、マルチプロセッシングを使用したいと考えています。プロセス内ではなくスレッド内で作業しているときに、カメラがハードウェア信号を受信して動作できる理由について、誰か洞察を持っていますか?