Я работаю над графическим интерфейсом 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 по-прежнему зависает во время выполнения дорогостоящей функции, и я не заметил никаких изменений с тех пор, как представил этот новый поток. Я что-то пропустил? Спасибо.
Я работаю над графическим интерфейсом [b]PyQt6[/b], которому необходимо в фоновом режиме вызывать функцию из библиотеки pyo3, которая выполняет [b]очень дорогостоящие вычисления[/b] с очень большим объемом данных (речь идет о векторах минимальной длиной в один миллиард; приложение используется в научном контексте). Эта функция занимает [b]от нескольких секунд до нескольких минут< /strong> для обработки отправленных на него данных. Однако я хочу избежать зависания и зависания графического интерфейса во время вычислений. Итак, я решил использовать QThread[/b], предоставляемый PyQt6, и вот пример части реализованного кода: [code]class FCSPostProcessingWorker(QThread): finished = pyqtSignal(object)
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)
[/code] Проблема в том, что [b]GUI по-прежнему зависает[/b] во время выполнения дорогостоящей функции, и я не заметил никаких изменений с тех пор, как представил этот новый поток. Я что-то пропустил? Спасибо.
В течение некоторого времени я сейчас работаю с QT в приложении, где я должен взять рамы с камеры. Камера будет работать в другом потоке, чем в остальной части приложения. Я следовал рекомендациям:
/
и
Я изучаю asyncio, и возникла проблема одновременного выполнения задач зависимости и задач независимости. До сих пор я не мог заставить это работать. Это мой код:
import asyncio
import random
def first_execution(choice):
if choice==1:
print(f First...
Я изучаю asyncio, и возникла проблема одновременного выполнения задач зависимости и задач независимости. До сих пор мне не удавалось заставить это работать. Это мой код:
import asyncio
import random
Я изучаю asyncio, и возникла проблема одновременного выполнения задач зависимости и задач независимости. До сих пор мне не удавалось заставить это работать. Это мой код:
import asyncio
import random
I tried to install tensorflow GPU in an anaconda enviorement, my hardware and software resources are:
GPU: Quadro K1100M python: 3.10.13 cudatoolkit: 11.2 cudnn: 8.1.0 OS: Windows 11 Tensorflow: 2.10
Everything goes well, but when I test if...