Python 函数调用未从线程正确运行
Python function call not runing correcly from thread
我在让它工作时遇到了一些麻烦,我正在尝试将 GUI 文本附加到已经存在的 window,我正在使用 Autodesk Maya 的 python 解释器,我在此处附上主机脚本的一部分,我在其中检查多个连接并尝试为每个连接添加文本。
问题 在线程内的 while 循环中调用 interpHostData() 函数时出现,它不会向window;
但每当我在线程外单独调用函数时,它都能正常工作。
如果有人知道我该如何解决这个问题,我将不胜感激,在此先感谢。
def hostUpdate():
global socketHost
global clientL
clientL=[]
cmds.text('mt1',e=1,l='Update Process Started...')
while 1:
connectionMain,addressMain=socketHost.accept()
cmds.text('mt1',e=1,l='Connected with: %s'%str(addressMain))
#----------Different Thread for each connection
tid=thr.start_new_thread(hostRecieve,(connectionMain,addressMain))
clientL.append([connectionMain,addressMain,tid])
cmds.text('mt1',e=1,l='Thread started with: %s'%str(addressMain))
def hostRecieve(connI,addrI):
global clientL
cmds.text('mt1',e=1,l='Recieve Process Started...')
while 1: #------------------------------------Loop to keep listening for connections
try:
cmData=connI.recv(4096)
interpHostData(cmData) #--------------IF I CALL FROM HERE DOSN'T WORK
except:
for cl in clientL:
if connI==cl[0]:
clientL.remove(cl)
cmds.text('mt1',e=1,l='Disconnected from %s'%str(addrI))
break
def interpHostData(cmDataC):
global cliLayout
tplD=cmDataC.split(',')
if tplD[0]=='0':
cID=tplD[2]
cmds.setParent(cliLayout)
cmds.text(cID+'_1',l=tplD[1])
cmds.text(cID+'_2',l=tplD[3])
cmds.text(cID+'_3',l=tplD[4])
cmds.text(cID+'_4',l='_')
cmds.text(cID+'_5',l='_')
cmds.text(cID+'_6',l='_')
cmds.text(cID+'_7',l='_')
cmds.text(cID+'_8',l='_')
cmds.columnLayout(cID+'_9')
cmds.progressBar(cID+'_10',h=10)
cmds.progressBar(cID+'_11',h=10)
cmds.setParent(cliLayout)
cmds.text(cID+'_12',l='_')
cmds.text(cID+'_13',l='Online')
您只能从主线程 运行 Maya ui 命令。您可以使用 maya.util.ExcecuteDeferred()
to get around this to some degree but it takes extra work and won't be as responsive as a true multi-threaded app. Longer explanation in this question
我在让它工作时遇到了一些麻烦,我正在尝试将 GUI 文本附加到已经存在的 window,我正在使用 Autodesk Maya 的 python 解释器,我在此处附上主机脚本的一部分,我在其中检查多个连接并尝试为每个连接添加文本。
问题 在线程内的 while 循环中调用 interpHostData() 函数时出现,它不会向window;
但每当我在线程外单独调用函数时,它都能正常工作。
如果有人知道我该如何解决这个问题,我将不胜感激,在此先感谢。
def hostUpdate():
global socketHost
global clientL
clientL=[]
cmds.text('mt1',e=1,l='Update Process Started...')
while 1:
connectionMain,addressMain=socketHost.accept()
cmds.text('mt1',e=1,l='Connected with: %s'%str(addressMain))
#----------Different Thread for each connection
tid=thr.start_new_thread(hostRecieve,(connectionMain,addressMain))
clientL.append([connectionMain,addressMain,tid])
cmds.text('mt1',e=1,l='Thread started with: %s'%str(addressMain))
def hostRecieve(connI,addrI):
global clientL
cmds.text('mt1',e=1,l='Recieve Process Started...')
while 1: #------------------------------------Loop to keep listening for connections
try:
cmData=connI.recv(4096)
interpHostData(cmData) #--------------IF I CALL FROM HERE DOSN'T WORK
except:
for cl in clientL:
if connI==cl[0]:
clientL.remove(cl)
cmds.text('mt1',e=1,l='Disconnected from %s'%str(addrI))
break
def interpHostData(cmDataC):
global cliLayout
tplD=cmDataC.split(',')
if tplD[0]=='0':
cID=tplD[2]
cmds.setParent(cliLayout)
cmds.text(cID+'_1',l=tplD[1])
cmds.text(cID+'_2',l=tplD[3])
cmds.text(cID+'_3',l=tplD[4])
cmds.text(cID+'_4',l='_')
cmds.text(cID+'_5',l='_')
cmds.text(cID+'_6',l='_')
cmds.text(cID+'_7',l='_')
cmds.text(cID+'_8',l='_')
cmds.columnLayout(cID+'_9')
cmds.progressBar(cID+'_10',h=10)
cmds.progressBar(cID+'_11',h=10)
cmds.setParent(cliLayout)
cmds.text(cID+'_12',l='_')
cmds.text(cID+'_13',l='Online')
您只能从主线程 运行 Maya ui 命令。您可以使用 maya.util.ExcecuteDeferred()
to get around this to some degree but it takes extra work and won't be as responsive as a true multi-threaded app. Longer explanation in this question