PyQt6 QThread не работает с высокими вычислительными задачамиPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 PyQt6 QThread не работает с высокими вычислительными задачами

Сообщение Anonymous »

Я работаю над графическим интерфейсом PyQt6, которому необходимо в фоновом режиме вызывать функцию из библиотеки pyo3, которая выполняет очень дорогостоящие вычисления с очень большим объемом данных (речь идет о векторах минимальной длиной в один миллиард; приложение используется в научном контексте).
Эта функция занимает от нескольких секунд до нескольких минут< /strong> для обработки отправленных на него данных. Однако я хочу избежать зависания и зависания графического интерфейса во время вычислений.
Итак, я решил использовать QThread
, предоставляемый PyQt6, и вот пример части реализованного кода:

Код: Выделить всё

class FCSPostProcessingWorker(QThread):
finished = pyqtSignal(object)

def __init__(self, active_correlations, num_acquisitions):
super().__init__()
self.active_correlations = active_correlations
self.num_acquisitions = num_acquisitions
self.is_running = True

def run(self):
gt_results = fcs_flim.fluorescence_correlation_spectroscopy(
num_acquisitions=self.num_acquisitions,
correlations=self.active_correlations,
)
self.finished.emit(gt_results)

def stop(self):
self.is_running = False

class FCSPostProcessing:
@staticmethod
def get_input(app):
correlations = [tuple(item) if isinstance(item, list) else item for item in app.ch_correlations]
active_correlations = [(ch1, ch2) for ch1, ch2, active in correlations if active]
#num_acquisitions = app.selected_average
num_acquisitions = 3
worker = FCSPostProcessingWorker(active_correlations, num_acquisitions)
QApplication.processEvents()
worker.finished.connect(lambda result: FCSPostProcessing.handle_fcs_post_processing_result(app, result, worker))
worker.start()

@staticmethod
def handle_fcs_post_processing_result(app, gt_results, worker):
worker.stop()
remove_widget(app.layouts[PLOT_GRIDS_CONTAINER], app.widgets[GT_WIDGET_WRAPPER])
gt_widget = create_gt_layout(app)
insert_widget(app.layouts[PLOT_GRIDS_CONTAINER], gt_widget, 1)
gt_plot_to_show = [tuple(item) if isinstance(item, list) else item for item in app.gt_plots_to_show]
lag_index = gt_results[0]
filtered_gt_results = [res for res in gt_results[1] if res[0] in gt_plot_to_show]
for index, res in enumerate(filtered_gt_results):
correlation = res[0]
gt_values = res[1]
FCSPostProcessingPlot.generate_chart(correlation, index, app, lag_index, gt_values)

Проблема в том, что GUI по-прежнему зависает во время выполнения дорогостоящей функции, и я не заметил никаких изменений с тех пор, как представил этот новый поток. Я что-то пропустил? Спасибо.

Подробнее здесь: https://stackoverflow.com/questions/783 ... onal-tasks
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»