Split addon code up by purpose
This commit is contained in:
50
subprocess_adapter.py
Normal file
50
subprocess_adapter.py
Normal file
@@ -0,0 +1,50 @@
|
||||
import logging
|
||||
from multiprocessing import Process, Pipe
|
||||
|
||||
class SubprocessOperatorMixin:
|
||||
timer = None
|
||||
log = logging.getLogger("%s.SubprocessOperatorMixin" % __name__)
|
||||
|
||||
# run once in invoke
|
||||
def setup(self):
|
||||
pass
|
||||
# run on receipt of data from subprocess
|
||||
def handle_response(self, resp):
|
||||
pass
|
||||
|
||||
def __init__(self):
|
||||
self.pipe = Pipe()
|
||||
self.subprocess = None
|
||||
|
||||
def execute(self, context):
|
||||
return self.invoke(context, None)
|
||||
|
||||
def invoke(self, context, event):
|
||||
self.subprocess.start()
|
||||
# we have to explicitly close the end of the pipe we are NOT using,
|
||||
# otherwise no exception will be generated when the other process closes its end.
|
||||
self.pipe[1].close()
|
||||
|
||||
wm = context.window_manager
|
||||
wm.modal_handler_add(self)
|
||||
self.timer = wm.event_timer_add(.01, context.window)
|
||||
|
||||
self.setup()
|
||||
|
||||
return {'RUNNING_MODAL'}
|
||||
|
||||
def modal(self, context, event):
|
||||
self.log.debug("polling")
|
||||
try:
|
||||
if self.pipe[0].poll():
|
||||
newdata = self.pipe[0].recv()
|
||||
else:
|
||||
newdata = None
|
||||
except EOFError:
|
||||
self.log.debug("done polling")
|
||||
return {'FINISHED'}
|
||||
|
||||
if newdata is not None:
|
||||
self.handle_response(newdata)
|
||||
return {'PASS_THROUGH'}
|
||||
|
Reference in New Issue
Block a user