Ver código fonte

synchonous terminals

Bastien Sevajol 8 anos atrás
pai
commit
8c5cfeef14
2 arquivos alterados com 27 adições e 10 exclusões
  1. 5 3
      sandbox/engulf/run.py
  2. 22 7
      synergine2/terminals.py

+ 5 - 3
sandbox/engulf/run.py Ver arquivo

42
         GrassSpawn,
42
         GrassSpawn,
43
     ]
43
     ]
44
 
44
 
45
-    def __init__(self):
46
-        super().__init__()
45
+    def __init__(self, *args, **kwargs):
46
+        super().__init__(*args, **kwargs)
47
         self.gui = None
47
         self.gui = None
48
 
48
 
49
     def receive(self, package: TerminalPackage):
49
     def receive(self, package: TerminalPackage):
137
     core = Core(
137
     core = Core(
138
         simulation=simulation,
138
         simulation=simulation,
139
         cycle_manager=CycleManager(simulation=simulation),
139
         cycle_manager=CycleManager(simulation=simulation),
140
-        terminal_manager=TerminalManager([GameTerminal()]),
140
+        terminal_manager=TerminalManager([GameTerminal(
141
+            asynchronous=False,
142
+        )]),
141
     )
143
     )
142
     core.run()
144
     core.run()
143
 
145
 

+ 22 - 7
synergine2/terminals.py Ver arquivo

42
     # who are not instance of listed classes
42
     # who are not instance of listed classes
43
     subscribed_events = [Event]
43
     subscribed_events = [Event]
44
 
44
 
45
-    def __init__(self):
45
+    def __init__(self, asynchronous: bool=True):
46
         self._input_queue = None
46
         self._input_queue = None
47
         self._output_queue = None
47
         self._output_queue = None
48
         self._stop_required = False
48
         self._stop_required = False
49
         self.subjects = {}
49
         self.subjects = {}
50
         self.cycle_events = []
50
         self.cycle_events = []
51
         self.event_handlers = collections.defaultdict(list)
51
         self.event_handlers = collections.defaultdict(list)
52
+        self.asynchronous = asynchronous
52
 
53
 
53
     def accept_event(self, event: Event) -> bool:
54
     def accept_event(self, event: Event) -> bool:
54
         for event_class in self.subscribed_events:
55
         for event_class in self.subscribed_events:
85
 
86
 
86
     def receive(self, package: TerminalPackage):
87
     def receive(self, package: TerminalPackage):
87
         self.update_with_package(package)
88
         self.update_with_package(package)
89
+        # End of cycle management signal
90
+        self.send(TerminalPackage(is_cycle=True))
88
 
91
 
89
     def send(self, package: TerminalPackage):
92
     def send(self, package: TerminalPackage):
90
         self._output_queue.put(package)
93
         self._output_queue.put(package)
153
 
156
 
154
     def receive(self) -> [TerminalPackage]:
157
     def receive(self) -> [TerminalPackage]:
155
         packages = []
158
         packages = []
156
-        for input_queue in self.inputs_queues.values():
157
-            try:
158
-                while True:
159
-                    packages.append(input_queue.get(block=False, timeout=None))
160
-            except Empty:
161
-                pass  # Queue is empty
159
+        for terminal, input_queue in self.inputs_queues.items():
160
+            # When terminal is synchronous, wait it's cycle package
161
+            if not terminal.asynchronous:
162
+                continue_ = True
163
+                while continue_:
164
+                    package = input_queue.get()
165
+                    # In case where terminal send package before end of cycle
166
+                    # management
167
+                    continue_ = not package.is_cycle
168
+                    packages.append(package)
169
+            else:
170
+                try:
171
+                    while True:
172
+                        packages.append(
173
+                            input_queue.get(block=False, timeout=None),
174
+                        )
175
+                except Empty:
176
+                    pass  # Queue is empty
162
 
177
 
163
         return packages
178
         return packages