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