2017-02-25 10 views
0

私は単純なGUIを構築して、マルチプロセッシングを学びたいと考えています。私のGUIでは、キャプチャボタンはフレームをキャプチャし、フレームまたは宣言されたスペース(Qlabel)内のGUI内に配置します。私はSOの他の投稿を読んだが、静かに私のプログラムでそれを使用する方法を理解していませんでした。エラーがGUIの外に使用することは安全ではないと述べたマルチプロセッシング:GUIスレッドの外側のピックスマップを使用することは安全ではありません

、私は私のQPixmapのは、メインスレッドで実行されていることを示し

print(multiprocessing.current_process()) 

を試してみました。これは私のプログラム

import examplegui 
from PySide.QtGui import * 
from PySide.QtCore import * 
import sys 
import multiprocessing 
import numpy as np 
import cv2 
from multiprocessing import Queue 

def image_capture(): 
    print(multiprocessing.current_process()) 
    print("starting img proc") 
    cap = cv2.VideoCapture(0) 
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 641) 
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 351) 
    ret, frame = cap.read() 
    cap.release() 

    if ret == True: 
     cv2.imwrite('frame.png', frame) 
     return frame 

class Maindialog(QMainWindow,examplegui.Ui_MainWindow): 
    pass_arguments = Signal(list) 

    def __init__(self,parent = None): 
     super(Maindialog,self).__init__(parent) 
     self.setupUi(self) 
     self.pool = multiprocessing.Pool(processes=4) 
     self.connect(self.excel_file,SIGNAL("clicked()"),self.apply_connection) 
    # self.pass_arguments.connect 


    def apply_connection(self): 
     print(multiprocessing.current_process()) 
     result = self.pool.apply_async(image_capture,callback=self.show_img) 

    def show_img(self,result): 
     print(multiprocessing.current_process()) 
     # print(result.type) 
     cv2.imshow("img",result) 
     image = QImage(result, result.shape[1], result.shape[0], result.strides[0], QImage.Format_RGB888) 
     self.vidimg.setPixmap(QPixmap.fromImage(image))    
     cv2.waitKey(0) 

    if __name__ == '__main__': 
     app = QApplication(sys.argv) 
     window = Maindialog() 
     window.show() 
     sys.exit(app.exec_()) 

である私は、イメージが実行されていることを確認するcv2.imshowをしましたが、私は、私はエラーに

QPixmap: It is not safe to use pixmaps outside the GUI thread 
QPixmap: It is not safe to use pixmaps outside the GUI thread 
QPixmap: It is not safe to use pixmaps outside the GUI thread 
を取得PROGを実行GUI.When内のそのイメージを必要とします

誰かが間違っている場所を教えてもらえますか?

enter image description here

+0

答えがあなたの問題を解決しましたRaghavendra? – ZF007

+0

@ ZF007本当はね!しかし、私はこのエラーを回避するためにスレッドを使用し、それは私の問題のために正常に動作します。 –

答えて

0

self.pool.apply_async実行Pythonのスレッドで各コールバック(self.show_img)は、それ以外の場合は、メインスレッドをブロックし、非同期ではないでしょう!

コールバックがチェックされているのは、メインプロセスで実行されていて、スレッドプロセスのメインスレッドではないことだけです。

関連する問題