Как выполнять интенсивные операции с помощью многопоточности в pyqt4 - PullRequest
0 голосов
/ 31 марта 2019

Я пишу графический интерфейс, который читает массив трехмерных массивов из файла 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)
...