关于pyqt的QThread,和multiprocessing一起工作

pyqt的QThread是可以多开一个线程,但是采用的是单线程的计算,当遇到计算密集型任务时候需要结合使用multiprocessing。
下面这个是要调动的程序

class call_DIC(QThread): #继承了一个类
    progressBarValue = pyqtSignal(int)  # 更新进度条
    #finishValue = pyqtSignal(int)
    # QThread下才能用pyqtSignal
    def __init__(self,params,coors,refimage,dic_results,lock,StrmBMPName):
        #super(call_DIC,self).__init__()
        #super().__init__()
        QThread.__init__(self)
        #Process.__init__(self)
        self.dic_results = dresults
        self.lock = lock
        self.calNum = mp.Manager().Queue()
        self.cal_num_now=0
        
    def run(self):
        aData = cxnDataset()
        self.pool = mp.Pool(len(self.params.img_series)-1)
        for i in range(1,len(self.params.img_series)):
            df_image_num = self.params.img_series[i]
            self.pool.apply_async(call_DIC11, (a,b,c,d,e,f,))
        self.pool.close()
        while True:
            while not self.calNum.empty():
                pp=self.calNum.get()
                self.cal_num_now+=pp
                self.progressBarValue.emit(pp)
            if self.dc-self.cal_num_now<=200*self.img_num:
                # 判断是否计算完毕
                break
            time.sleep(0.1)
        self.pool.join()
       
        
    
def call_xx(a,b,c,d,e,dic_queues,
              dic_results,lock):
    if ii>0 and ii%200==0:
        dic_queues.put(200)
    dict_dic = {}
    lock.acquire()
    dic_results.put(dict_dic)
    lock.release()

下面的是主程序要调用上面的

def callback_progress(self, i):
    '''
    回传进度条参数
    '''
    self.cal_num_now+=i
    self.progressBardic.setValue(self.cal_num_now)
    if self.dc-self.cal_num_now<=200*self.img_num:
        # 判断是否计算完毕
        self.label_info.setText('计算完毕.')
        self.progressBardic.setValue(self.dc)

def aaRun(self):
    '''
    读取参数并开多个线程计算DIC,返回多进程DIC的计算数据并储存到二进制文件
    '''
    if len(os.listdir('./params')):
        params = pd.read_csv('./params/params.csv')
        coors = pd.read_csv('./params/coordinate.csv')
        x = np.int16(coors.x)
        self.dc = len(x)*(len(params.img_series)-1)
        self.img_num = len(params.img_series)-1
        self.progressBardic.setValue(0) # 设置进度条的最小值
        self.progressBardic.setMaximum(self.dc)
        rf_image_num = params.img_series[0]
        aData = cxnDataset()
        self.lock = mp.Manager().Lock()
        self.dic_results = mp.Manager().Queue()
        self.cal_num_now = 0
        self.cal_image_num = 0
        # QThread采用的是单核计算
        self.label_info.setText('正在计算...')
        #self.p_pool=[] # 这个必须设置成全局的,不然这个函数结束就没有了
        self.p=call_DIC(params,coors,aa,
                        self.ff,self.lock,self.dd)# 这个必须设置成全局的,不然这个函数结束就没有了
        self.p.progressBarValue.connect(self.callback_progress)
        self.p.finished.connect(self.p.deleteLater)
        self.p.start()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值