我已经写了两Maya和霍迪尼的脚本,我需要等待GUI更新之前,我可以叫我的Python代码,其余的方面时遇到的情况为晚。 我想打电话time.sleep在这两种情况下会固定我的问题,但似乎只是time.sleep举起父应用程序也是如此。 这意味着我的脚本计算完全一样的,无论睡眠是否是在那里,它只是通过暂停部分的方式。
我有一个思想来运行我的Python中一个单独的线程脚本,看是否会释放应用到睡眠时仍然运行,但我还没有来得及尚未进行测试。
想我会问在此期间,如果有人的一些其他的解决方案,这种情况下知道。
玛雅-或者更准确地说玛雅Python的-是不是真的多线程(Python本身有一个狡猾的一种多线程的,因为所有线程的恐惧斗争全局解释锁 ,但在这里,这不是你的问题)。 您可以使用线程模块在Maya运行线程代码就好了; 尝试:
import time
import threading
def test():
for n in range (0, 10):
print "hello"
time.sleep(1)
t = threading.Thread(target = test)
t.start()
这将打印“你好”到您的收听每隔一秒10次,而无需关闭交互。
不幸的是,玛雅的许多地方 - 包括最显着的所有用户创建的UI和大多数场景操作的 - 拥有玛雅UI的一个 - 只能从“主”线程中运行。 所以,你不能做一个脚本使用上述技术来改变窗口的文本框的内容(使情况变得更糟,你会得到误导性的错误消息 - 代码,当你从听者却错误时,运行它的工作原理你从线程中调用它,并礼貌地返回完全错误的错误代码)。 你可以做这样的事情的网络通信,在一个单独的线程写入文件,或长计算没有问题 - 但是如果你试图从一个线程做他们的工作的用户界面和许多常见的场景任务将失败。
玛雅具有在此部分解决方法maya.utils模块。 您可以使用功能executeDeferred和executeInMainThreadWithResult。 这些等待的空闲时间来运行(这意味着,例如,如果你正在播放的动画,他们将无法运行),然后火,如果你想在主线程中完成它们。 从玛雅文档中的例子给出的思路:
import maya.utils import maya.cmds
def doSphere( radius ):
maya.cmds.sphere( radius=radius )
maya.utils.executeInMainThreadWithResult( doSphere, 5.0 )
这让你你最想要什么,但你需要仔细考虑如何将任务分解为穿线型块。 而且,当然,运行的线程程序总是比单线程替代更难,你需要设计的代码,这样的事情不会打破,如果用一个变量另一个线程混乱,而你的工作。 良好的并行编程是鱼的整个大壶,尽管可以归结为几个基本思路:
1)使用建立在对象(独家控制在短期操作) RLocks需要2时)把共享数据到安全的容器,如队列@迪伦的例子3)是什么对象是可共享的(他们应该少!)和真正明确不
这里的体面(长)概述。
至于胡迪尼,我不知道肯定,但这篇文章听起来好像出现有类似的问题。
更好的解决方案,而不是睡觉,就是一个while循环。 设置一个while循环来检查一个共享值(或甚至一个线程安全结构如队列)。 你的等待可以做他们的工作的父进程(或子女,这不重要谁派生的),当他们完成他们的工作,他们发送的true / false / 0/1 /不管到队列/变量让其他进程知道他们可能会继续。