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()