Beremiz_service.py
changeset 867 06495975e8a4
parent 850 072188d4d812
child 959 046aeae0d71c
equal deleted inserted replaced
866:ee6adf7586c1 867:06495975e8a4
   432 import Pyro.core as pyro
   432 import Pyro.core as pyro
   433 
   433 
   434 if not os.path.isdir(WorkingDir):
   434 if not os.path.isdir(WorkingDir):
   435     os.mkdir(WorkingDir)
   435     os.mkdir(WorkingDir)
   436 
   436 
   437 def default_evaluator(callable, *args, **kwargs):
   437 def default_evaluator(tocall, *args, **kwargs):
   438     return callable(*args,**kwargs)
   438     try:
       
   439         res=(tocall(*args,**kwargs), None)
       
   440     except Exception,exp:
       
   441         res=(None, exp)
       
   442     return res
   439 
   443 
   440 class Server():
   444 class Server():
   441     def __init__(self, servicename, ip_addr, port, workdir, argv, autostart=False, statuschange=None, evaluator=default_evaluator, website=None):
   445     def __init__(self, servicename, ip_addr, port, workdir, argv, autostart=False, statuschange=None, evaluator=default_evaluator, website=None):
   442         self.continueloop = True
   446         self.continueloop = True
   443         self.daemon = None
   447         self.daemon = None
   679     website = None
   683     website = None
   680 
   684 
   681 if havewx:
   685 if havewx:
   682     from threading import Semaphore
   686     from threading import Semaphore
   683     wx_eval_lock = Semaphore(0)
   687     wx_eval_lock = Semaphore(0)
   684     mythread = currentThread()
   688     main_thread = currentThread()
   685 
   689 
   686     def statuschange(status):
   690     def statuschange(status):
   687         wx.CallAfter(taskbar_instance.UpdateIcon,status)
   691         wx.CallAfter(taskbar_instance.UpdateIcon,status)
   688         
   692         
   689     eval_res = None
   693     def wx_evaluator(obj, *args, **kwargs):
   690     def wx_evaluator(callable, *args, **kwargs):
   694         tocall,args,kwargs = obj.call
   691         global eval_res
   695         obj.res = default_evaluator(tocall, *args, **kwargs)
   692         try:
   696         wx_eval_lock.release()
   693             eval_res=callable(*args,**kwargs)
   697         
   694         except Exception,e:
   698     def evaluator(tocall, *args, **kwargs):
   695             PLCprint("#EXCEPTION : "+str(e))
   699         global main_thread
   696         finally:
   700         if(main_thread == currentThread()):
   697             wx_eval_lock.release()
   701             # avoid dead lock if called from the wx mainloop 
   698         
   702             return default_evaluator(tocall, *args, **kwargs)
   699     def evaluator(callable, *args, **kwargs):
       
   700         # call directly the callable function if call from the wx mainloop (avoid dead lock) 
       
   701         if(mythread == currentThread()):
       
   702             callable(*args,**kwargs)
       
   703         else:
   703         else:
   704             wx.CallAfter(wx_evaluator,callable,*args,**kwargs)
   704             o=type('',(object,),dict(call=(tocall, args, kwargs), res=None))
       
   705             wx.CallAfter(wx_evaluator,o)
   705             wx_eval_lock.acquire()
   706             wx_eval_lock.acquire()
   706         return eval_res
   707             return o.res
   707     
   708     
   708     pyroserver = Server(servicename, given_ip, port, WorkingDir, argv, autostart, statuschange, evaluator, website)
   709     pyroserver = Server(servicename, given_ip, port, WorkingDir, argv, autostart, statuschange, evaluator, website)
   709     taskbar_instance = BeremizTaskBarIcon(pyroserver, enablewx)
   710     taskbar_instance = BeremizTaskBarIcon(pyroserver, enablewx)
   710 else:
   711 else:
   711     pyroserver = Server(servicename, given_ip, port, WorkingDir, argv, autostart, website=website)
   712     pyroserver = Server(servicename, given_ip, port, WorkingDir, argv, autostart, website=website)