Improved interruptable sleep and warn user when using time.sleep.
This commit is contained in:
@@ -1186,7 +1186,6 @@ get_ylabel set_ylabel"""
|
|||||||
compexp.add_provider(self.compwexp)
|
compexp.add_provider(self.compwexp)
|
||||||
compres.add_provider(self.compwres)
|
compres.add_provider(self.compwres)
|
||||||
|
|
||||||
# script fonts are atlered by configuration
|
|
||||||
# clipboard
|
# clipboard
|
||||||
self.main_clipboard = gtk.Clipboard( )
|
self.main_clipboard = gtk.Clipboard( )
|
||||||
|
|
||||||
@@ -1194,13 +1193,12 @@ get_ylabel set_ylabel"""
|
|||||||
self.experiment_script_statusbar_label = self.xml_gui.get_object( "statusbar_experiment_script_label" )
|
self.experiment_script_statusbar_label = self.xml_gui.get_object( "statusbar_experiment_script_label" )
|
||||||
self.data_handling_statusbar_label = self.xml_gui.get_object( "statusbar_data_handling_label" )
|
self.data_handling_statusbar_label = self.xml_gui.get_object( "statusbar_data_handling_label" )
|
||||||
|
|
||||||
# footline with line and col indicators
|
# footer with line and col indicators
|
||||||
self.experiment_script_line_indicator = self.xml_gui.get_object( "experiment_script_line_textfield" )
|
self.experiment_script_line_indicator = self.xml_gui.get_object( "experiment_script_line_textfield" )
|
||||||
self.experiment_script_column_indicator = self.xml_gui.get_object( "experiment_script_column_textfield" )
|
self.experiment_script_column_indicator = self.xml_gui.get_object( "experiment_script_column_textfield" )
|
||||||
self.data_handling_line_indicator = self.xml_gui.get_object( "data_handling_line_textfield" )
|
self.data_handling_line_indicator = self.xml_gui.get_object( "data_handling_line_textfield" )
|
||||||
self.data_handling_column_indicator = self.xml_gui.get_object( "data_handling_column_textfield" )
|
self.data_handling_column_indicator = self.xml_gui.get_object( "data_handling_column_textfield" )
|
||||||
|
|
||||||
|
|
||||||
# some event handlers
|
# some event handlers
|
||||||
self.experiment_script_textbuffer.connect( "modified-changed", self.textviews_modified )
|
self.experiment_script_textbuffer.connect( "modified-changed", self.textviews_modified )
|
||||||
self.experiment_script_textview.connect_after( "move-cursor", self.textviews_moved )
|
self.experiment_script_textview.connect_after( "move-cursor", self.textviews_moved )
|
||||||
@@ -1211,8 +1209,7 @@ get_ylabel set_ylabel"""
|
|||||||
self.data_handling_textview.connect( "key-press-event", self.textviews_keypress )
|
self.data_handling_textview.connect( "key-press-event", self.textviews_keypress )
|
||||||
self.data_handling_textview.connect( "button-release-event", self.textviews_clicked )
|
self.data_handling_textview.connect( "button-release-event", self.textviews_clicked )
|
||||||
|
|
||||||
# and the editing toolbar part
|
# and the editing toolbar buttons
|
||||||
# buttons
|
|
||||||
self.toolbar_new_button = self.xml_gui.get_object( "toolbar_new_button" )
|
self.toolbar_new_button = self.xml_gui.get_object( "toolbar_new_button" )
|
||||||
self.toolbar_open_button = self.xml_gui.get_object( "toolbar_open_file_button" )
|
self.toolbar_open_button = self.xml_gui.get_object( "toolbar_open_file_button" )
|
||||||
self.toolbar_save_button = self.xml_gui.get_object( "toolbar_save_file_button" )
|
self.toolbar_save_button = self.xml_gui.get_object( "toolbar_save_file_button" )
|
||||||
@@ -1223,8 +1220,9 @@ get_ylabel set_ylabel"""
|
|||||||
self.toolbar_redo_button = self.xml_gui.get_object( "toolbar_redo_button" )
|
self.toolbar_redo_button = self.xml_gui.get_object( "toolbar_redo_button" )
|
||||||
self.toolbar_search_button = self.xml_gui.get_object("toolbar_search_button")
|
self.toolbar_search_button = self.xml_gui.get_object("toolbar_search_button")
|
||||||
|
|
||||||
# my notebook
|
# main notebook
|
||||||
self.main_notebook = self.xml_gui.get_object( "main_notebook" )
|
self.main_notebook = self.xml_gui.get_object( "main_notebook" )
|
||||||
|
|
||||||
# config toolbar
|
# config toolbar
|
||||||
self.main_notebook.connect_after( "switch_page", self.notebook_page_switched )
|
self.main_notebook.connect_after( "switch_page", self.notebook_page_switched )
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import io
|
|||||||
import traceback
|
import traceback
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
|
import ast
|
||||||
from damaris.experiments.Experiment import Quit
|
from damaris.experiments.Experiment import Quit
|
||||||
from damaris.experiments import Experiment
|
from damaris.experiments import Experiment
|
||||||
|
|
||||||
@@ -48,8 +49,32 @@ class ExperimentHandling(threading.Thread):
|
|||||||
self.raised_exception = None
|
self.raised_exception = None
|
||||||
self.location = None
|
self.location = None
|
||||||
exp_iterator=None
|
exp_iterator=None
|
||||||
|
|
||||||
|
# check for time.sleep()
|
||||||
|
try:
|
||||||
|
tree = ast.parse(self.script)
|
||||||
|
for node in ast.walk(tree):
|
||||||
|
found_blocking_sleep = False
|
||||||
|
if isinstance(node, ast.Call):
|
||||||
|
func = node.func
|
||||||
|
if isinstance(func, ast.Attribute) and func.attr == 'sleep':
|
||||||
|
if isinstance(func.value, ast.Name) and func.value.id == 'time':
|
||||||
|
found_blocking_sleep = True
|
||||||
|
elif isinstance(node, ast.ImportFrom) and node.module == 'time':
|
||||||
|
for alias in node.names:
|
||||||
|
if alias.name == 'sleep':
|
||||||
|
found_blocking_sleep = True
|
||||||
|
|
||||||
|
if found_blocking_sleep:
|
||||||
|
print("Warning: time.sleep() detected in experiment script. This is blocking and not interruptible. Please use sleep() instead.")
|
||||||
|
break
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
try:
|
try:
|
||||||
exec(self.script, dataspace)
|
exec(self.script, dataspace)
|
||||||
|
except StopExperiment:
|
||||||
|
return
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.raised_exception=e
|
self.raised_exception=e
|
||||||
self.location=traceback.extract_tb(sys.exc_info()[2])[-1][1:3]
|
self.location=traceback.extract_tb(sys.exc_info()[2])[-1][1:3]
|
||||||
@@ -61,6 +86,8 @@ class ExperimentHandling(threading.Thread):
|
|||||||
if "experiment" in dataspace:
|
if "experiment" in dataspace:
|
||||||
try:
|
try:
|
||||||
exp_iterator=dataspace["experiment"]()
|
exp_iterator=dataspace["experiment"]()
|
||||||
|
except StopExperiment:
|
||||||
|
return
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.raised_exception=e
|
self.raised_exception=e
|
||||||
self.location=traceback.extract_tb(sys.exc_info()[2])[-1][1:3]
|
self.location=traceback.extract_tb(sys.exc_info()[2])[-1][1:3]
|
||||||
|
|||||||
@@ -4,7 +4,9 @@ import sys
|
|||||||
import os
|
import os
|
||||||
import os.path
|
import os.path
|
||||||
import traceback
|
import traceback
|
||||||
|
import ast
|
||||||
from damaris.data import Resultable
|
from damaris.data import Resultable
|
||||||
|
from damaris.gui.ExperimentHandling import StopExperiment
|
||||||
|
|
||||||
class ResultHandling(threading.Thread):
|
class ResultHandling(threading.Thread):
|
||||||
"""
|
"""
|
||||||
@@ -30,10 +32,35 @@ class ResultHandling(threading.Thread):
|
|||||||
del data_classes
|
del data_classes
|
||||||
dataspace["results"]=self
|
dataspace["results"]=self
|
||||||
dataspace["data"]=self.data_space
|
dataspace["data"]=self.data_space
|
||||||
|
dataspace["sleep"]=self.sleep
|
||||||
self.raised_exception=None
|
self.raised_exception=None
|
||||||
self.location = None
|
self.location = None
|
||||||
|
|
||||||
|
# check for time.sleep()
|
||||||
|
try:
|
||||||
|
tree = ast.parse(self.script)
|
||||||
|
for node in ast.walk(tree):
|
||||||
|
found_blocking_sleep = False
|
||||||
|
if isinstance(node, ast.Call):
|
||||||
|
func = node.func
|
||||||
|
if isinstance(func, ast.Attribute) and func.attr == 'sleep':
|
||||||
|
if isinstance(func.value, ast.Name) and func.value.id == 'time':
|
||||||
|
found_blocking_sleep = True
|
||||||
|
elif isinstance(node, ast.ImportFrom) and node.module == 'time':
|
||||||
|
for alias in node.names:
|
||||||
|
if alias.name == 'sleep':
|
||||||
|
found_blocking_sleep = True
|
||||||
|
|
||||||
|
if found_blocking_sleep:
|
||||||
|
print("Warning: time.sleep() detected in result script. This is blocking and not interruptible. Please use sleep() instead.")
|
||||||
|
break
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
try:
|
try:
|
||||||
exec(self.script, dataspace)
|
exec(self.script, dataspace)
|
||||||
|
except StopExperiment:
|
||||||
|
return
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.raised_exception=e
|
self.raised_exception=e
|
||||||
self.location=traceback.extract_tb(sys.exc_info()[2])[-1][1:3]
|
self.location=traceback.extract_tb(sys.exc_info()[2])[-1][1:3]
|
||||||
@@ -47,6 +74,8 @@ class ResultHandling(threading.Thread):
|
|||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
dataspace["result"]()
|
dataspace["result"]()
|
||||||
|
except StopExperiment:
|
||||||
|
pass
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.raised_exception=e
|
self.raised_exception=e
|
||||||
self.location=traceback.extract_tb(sys.exc_info()[2])[-1][1:3]
|
self.location=traceback.extract_tb(sys.exc_info()[2])[-1][1:3]
|
||||||
@@ -56,6 +85,11 @@ class ResultHandling(threading.Thread):
|
|||||||
traceback_file=None
|
traceback_file=None
|
||||||
dataspace=None
|
dataspace=None
|
||||||
|
|
||||||
|
def sleep(self, seconds):
|
||||||
|
self.quit_flag.wait(seconds)
|
||||||
|
if self.quit_flag.isSet():
|
||||||
|
raise StopExperiment
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
if self.quit_flag.isSet():
|
if self.quit_flag.isSet():
|
||||||
self.results=None
|
self.results=None
|
||||||
|
|||||||
Reference in New Issue
Block a user