Я пишу графический интерфейс, который читает массив трехмерных массивов из файла hdf5, и после этого он выполняет некоторые тяжелые математические операции над массивом и выводит вычисленный массив обратно в hdf5, есть несколько радиокнопок, из которых мы можем выбирать математические операция должна быть сделана. Проблема в том, что когда я запускаю тяжелые математические функции, вся система зависает и графический интерфейс перестает отвечать на запросы.
У меня также есть кнопка для запуска окна дисплеев Mayavi для отображения громкости, которое также замораживает графический интерфейс.
Можно ли это сделать в других потоках в pyqt, чтобы система не зависала и графический интерфейс оставался отзывчивым.
Я пытался найти несколько решений
Многопоточность PyQt4 с использованием QThread
вызов функции основного потока из вторичного потока
Но я не смог получить никакого ответа
from PyQt4 import QtGui
import sys
import Sax_in_PyQt4 as design
from PyQt4 import QtCore
import util
import CompleTrace
import h5py
import dask.array as da
import numpy as np
import scipy
from SignalProcess import SignalProcess as sp
import urllib
class ComplexTrace(QtCore.QThread):
def __init__(self):
QtCore.QThread.__init__(self)
def get_file_input(self):
try:
file_name = QtGui.QFileDialog.getOpenFileName(self,"Choose a file ")
self.lineEdit_2.setText(file_name)
#self.lineEdit_2.setReadOnly(True)
except:
pass
def write_to_hd5(self, data):
try:
self.progressBar.maximum(100)
self.progressBar.setValue(0)
self.outpath = self.lineEdit.text()
with h5py.File(self.out_path , 'w') as self.f:
self.f.create_dataset(self.out_name, data=data )
self.f.close()
self.progressBar.setValue(100)
print(self.outpath)
except:
pass
def complex_trace(self):
try:
self.location = str(self.lineEdit_2.text())
self.f = h5py.File(self.location, 'r')
self.progressBar.setValue(10)
print(self.location)
self.name = self.location.split('/')[-1]
print(self.name)
self.data = self.f.get(self.name)
print(self.name)
self.array = np.array(self.data)
print(self.array.shape)
if self.radioButton_2.isChecked():
a = CompleTrace.ComplexAttributes()
b = a.envelope(darray = self.array)
c = np.array(b)
self.write_to_hd5(c)
except:
pass
class ExampleApp(QtGui.QMainWindow, design.Ui_MainWindow):
def __init__(self, parent=None):
super(ExampleApp, self).__init__(parent)
self.setupUi(self)
self.extract_vol = ComplexTrace()
self.pushButton_2.clicked.connect(lambda: self.extract_vol.get_file_input)
self.pushButton.clicked.connect(lambda: self.extract_vol.complex_trace)