进阶学习Maya中实现python定时器线程控制的3个技巧
白羽 2018-06-13 来源 :网络 阅读 1418 评论 0

摘要:本文将带你学习Maya中实现python定时器线程控制的3个技巧,希望本文对大家学Maya有所帮助。




在maya实现一下python定时器线程控制

不过简单的可行,建立物体等操作会有崩溃问题发生

并报出 r6025 pure virtual function call或者'Cannot convert data of type string[] to type string

然后就崩溃了

但是平常的移动之类没什么问题

可以用来刷新一些东西

另外这种方法不会阻塞maya的主线程,也就是说你可以一边操作一边看

以下代码操作注意有可能会导致maya崩溃

[python] view plain copy print?
1. import threading as thd  
2. import time  
3. import maya.cmds as cmds  
4.   
5. global aaa  
6. aaa = 1  
7. def fn():  
8.     global aaa  
9.     aaa += 1  
10.     cmds.polySphere(n='mySphere'+str(aaa),sx=1, sy=1, r=1)  
11.     cmds.select( clear=True )  
12.     thd.Timer(1,fn).start()  
13.   
14. fn()

上面的就会崩溃

下面的就不会,估计是创建的问题(需要新建一个叫sphere的物体)

[python] view plain copy print?
1. import threading as thd  
2. import time  
3. import maya.cmds as cmds  
4.   
5. global aaa  
6. aaa = 1  
7. def fn():  
8.     global aaa  
9.     aaa += 1  
10.     cmds.setAttr( 'sphere.translateX', aaa )  
11.     cmds.select( clear=True )  
12.     thd.Timer(1,fn).start()  
13.   
14. fn()

然后下面是可以使用的定时器,但是关闭后无法重开

[python] view plain copy print?
1. from threading import Timer,Thread,Event  
2. import time  
3.   
4. class myTimer():  
5.   
6.    def __init__(self,t,hFunction):  
7.       self.t=t  
8.       self.hFunction = hFunction  
9.       self.thread = Timer(self.t,self.handle_function)  
10.   
11.    def handle_function(self):  
12.       self.hFunction()  
13.       self.thread = Timer(self.t,self.handle_function)  
14.       self.thread.start()  
15.   
16.    def start(self):  
17.       self.thread.start()  
18.   
19.    def cancel(self):  
20.       self.thread.cancel()  
21.   
22. def printer():  
23.     print time.time()  
24.   
25.   
26. t = myTimer(1,printer)  
27. def defaultButtonPush(*args):  
28.   print 'shenmifangke.'  
29. def defaultButtonPush2(*args):  
30.   t.start()  
31. def defaultButtonPush3(*args):  
32.   t.cancel()  
33. cmds.window( width=150 )  
34. cmds.columnLayout( adjustableColumn=True )  
35. cmds.button( label='test', command=defaultButtonPush )  
36. cmds.button( label='开启',  command=defaultButtonPush2)  
37. cmds.button( label='关闭',  command=defaultButtonPush3 )  
38. cmds.showWindow()  
后来网上查到这个是可以使用的,这个在cancel后可以重开
[python] view plain copy print?
1. from threading import Timer  
2. import time  
3.   
4.   
5. class InfiniteTimer():  
6.     """A Timer class that does not stop, unless you want it to."""  
7.   
8.     def __init__(self, seconds, target):  
9.         self._should_continue = False  
10.         self.is_running = False  
11.         self.seconds = seconds  
12.         self.target = target  
13.         self.thread = None  
14.   
15.     def _handle_target(self):  
16.         self.is_running = True  
17.         self.target()  
18.         self.is_running = False  
19.         self._start_timer()  
20.   
21.     def _start_timer(self):  
22.         if self._should_continue: # Code could have been running when cancel was called.  
23.             self.thread = Timer(self.seconds, self._handle_target)  
24.             self.thread.start()  
25.   
26.     def start(self):  
27.         if not self._should_continue and not self.is_running:  
28.             self._should_continue = True  
29.             self._start_timer()  
30.         else:  
31.             print("Timer already started or running, please wait if you're restarting.")  
32.   
33.     def cancel(self):  
34.         if self.thread is not None:  
35.             self._should_continue = False # Just in case thread is running and cancel fails.  
36.             self.thread.cancel()  
37.         else:  
38.             print("Timer never started or failed to initialize.")  
39.   
40.   
41. def tick():  
42.     cmds.polySphere(r=True)  
43.     print('shenmifangke')  
44.   
45. # Example Usage  
46. t = InfiniteTimer(1.5, tick)  
47. t.start()


但是测试后发现很容易崩溃

这是什么原因呢

[python] view plain copy print?
1. import threading  
2. import time  
3. import maya.utils as utils  
4.   
5. def example(interval, ):  
6.     global run_timer = True  
7.     def your_function_goes_here():  
8.         cmds.polySphere(r=True)  
9.   
10.     while run_timer:   
11.         time.sleep(interval)  
12.         utils.executeDeferred(your_function_goes_here)  
13.         # always use executeDeferred or evalDeferredInMainThreadWithResult if you're running a thread in Maya!  
14.   
15. t = threading.Thread(None, target = example, args = (1,) )  
16. t.start()


然后又找到了上面的代码,完全不会崩溃

原因就是

executeDeferred


这个就是在建立物体后没有延迟和maya产生的冲突使得maya崩溃了

然后上面代码当然能进行改造了。


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标常用软件之Maya频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程