Skip to content
Snippets Groups Projects

Do simulation in separate thread

Merged Oscar Gustafsson requested to merge threadedsim into master
4 files
+ 47
27
Compare changes
  • Side-by-side
  • Inline
Files
4
+ 21
21
@@ -12,7 +12,7 @@ from collections import deque
@@ -12,7 +12,7 @@ from collections import deque
from pprint import pprint
from pprint import pprint
from typing import Dict, List, Optional, Tuple, cast
from typing import Dict, List, Optional, Tuple, cast
from qtpy.QtCore import QCoreApplication, QFileInfo, QSettings, QSize, Qt
from qtpy.QtCore import QCoreApplication, QFileInfo, QSettings, QSize, Qt, QThread
from qtpy.QtGui import QCursor, QIcon, QKeySequence, QPainter
from qtpy.QtGui import QCursor, QIcon, QKeySequence, QPainter
from qtpy.QtWidgets import (
from qtpy.QtWidgets import (
QAction,
QAction,
@@ -39,9 +39,8 @@ from b_asic.GUI.gui_interface import Ui_main_window
@@ -39,9 +39,8 @@ from b_asic.GUI.gui_interface import Ui_main_window
from b_asic.GUI.port_button import PortButton
from b_asic.GUI.port_button import PortButton
from b_asic.GUI.select_sfg_window import SelectSFGWindow
from b_asic.GUI.select_sfg_window import SelectSFGWindow
from b_asic.GUI.show_pc_window import ShowPCWindow
from b_asic.GUI.show_pc_window import ShowPCWindow
# from b_asic.GUI.simulate_sfg_window import Plot, SimulateSFGWindow
from b_asic.GUI.simulate_sfg_window import SimulateSFGWindow
from b_asic.GUI.simulate_sfg_window import SimulateSFGWindow
 
from b_asic.GUI.simulation_worker import SimulationWorker
from b_asic.GUI.util_dialogs import FaqWindow, KeybindingsWindow
from b_asic.GUI.util_dialogs import FaqWindow, KeybindingsWindow
from b_asic.gui_utils.about_window import AboutWindow
from b_asic.gui_utils.about_window import AboutWindow
from b_asic.gui_utils.decorators import decorate_class, handle_error
from b_asic.gui_utils.decorators import decorate_class, handle_error
@@ -51,9 +50,7 @@ from b_asic.port import InputPort, OutputPort
@@ -51,9 +50,7 @@ from b_asic.port import InputPort, OutputPort
from b_asic.save_load_structure import python_to_sfg, sfg_to_python
from b_asic.save_load_structure import python_to_sfg, sfg_to_python
from b_asic.signal import Signal
from b_asic.signal import Signal
from b_asic.signal_flow_graph import SFG
from b_asic.signal_flow_graph import SFG
from b_asic.simulation import Simulation
# from b_asic import FastSimulation
from b_asic.simulation import Simulation as FastSimulation
from b_asic.special_operations import Input, Output
from b_asic.special_operations import Input, Output
logging.basicConfig(level=logging.INFO)
logging.basicConfig(level=logging.INFO)
@@ -89,6 +86,7 @@ class MainWindow(QMainWindow):
@@ -89,6 +86,7 @@ class MainWindow(QMainWindow):
self.sfg_dict = {}
self.sfg_dict = {}
self._window = self
self._window = self
self.logger = logging.getLogger(__name__)
self.logger = logging.getLogger(__name__)
 
self._plot: Dict[Simulation, PlotWindow] = dict()
# Create Graphics View
# Create Graphics View
self.graphic_view = QGraphicsView(self.scene, self)
self.graphic_view = QGraphicsView(self.scene, self)
@@ -237,7 +235,6 @@ class MainWindow(QMainWindow):
@@ -237,7 +235,6 @@ class MainWindow(QMainWindow):
module, accepted = QFileDialog().getOpenFileName()
module, accepted = QFileDialog().getOpenFileName()
if not accepted:
if not accepted:
return
return
self.addRecentFile(module)
self._load_from_file(module)
self._load_from_file(module)
def _load_from_file(self, module) -> None:
def _load_from_file(self, module) -> None:
@@ -250,6 +247,8 @@ class MainWindow(QMainWindow):
@@ -250,6 +247,8 @@ class MainWindow(QMainWindow):
)
)
return
return
 
self.addRecentFile(module)
 
while sfg.name in self.sfg_dict:
while sfg.name in self.sfg_dict:
self.logger.warning(
self.logger.warning(
f"Duplicate SFG with name: {sfg.name} detected. "
f"Duplicate SFG with name: {sfg.name} detected. "
@@ -741,22 +740,23 @@ class MainWindow(QMainWindow):
@@ -741,22 +740,23 @@ class MainWindow(QMainWindow):
self.pressed_operations = selected
self.pressed_operations = selected
def _simulate_sfg(self) -> None:
def _simulate_sfg(self) -> None:
 
self._thread = dict()
 
self._sim_worker = dict()
for sfg, properties in self._simulation_dialog.properties.items():
for sfg, properties in self._simulation_dialog.properties.items():
self.logger.info("Simulating SFG with name: %s" % str(sfg.name))
self.logger.info("Simulating SFG with name: %s" % str(sfg.name))
simulation = FastSimulation(sfg, input_providers=properties["input_values"])
self._sim_worker[sfg] = SimulationWorker(sfg, properties)
l_result = simulation.run_for(
self._thread[sfg] = QThread()
properties["iteration_count"],
self._sim_worker[sfg].moveToThread(self._thread[sfg])
save_results=properties["all_results"],
self._thread[sfg].started.connect(self._sim_worker[sfg].start_simulation)
)
self._sim_worker[sfg].finished.connect(self._thread[sfg].quit)
self._sim_worker[sfg].finished.connect(self._show_plot_window)
print(f"{'=' * 10} {sfg.name} {'=' * 10}")
self._sim_worker[sfg].finished.connect(self._sim_worker[sfg].deleteLater)
pprint(simulation.results if properties["all_results"] else l_result)
self._thread[sfg].finished.connect(self._thread[sfg].deleteLater)
print(f"{'=' * 10} /{sfg.name} {'=' * 10}")
self._thread[sfg].start()
if properties["show_plot"]:
def _show_plot_window(self, sim: Simulation):
self.logger.info("Opening plot for SFG with name: " + str(sfg.name))
self._plot[sim] = PlotWindow(sim.results, sfg_name=sim._sfg.name)
self._plot = PlotWindow(simulation.results, sfg_name=sfg.name)
self._plot[sim].show()
self._plot.show()
def simulate_sfg(self, event=None) -> None:
def simulate_sfg(self, event=None) -> None:
self._simulation_dialog = SimulateSFGWindow(self)
self._simulation_dialog = SimulateSFGWindow(self)
Loading