You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kivy应用中子线程初始化第三方.NET DLL仍阻塞主线程的问题咨询

Kivy应用中子线程初始化第三方.NET DLL仍阻塞主线程的问题咨询

大家好,我遇到了一个Kivy应用里的棘手问题,想请教下各位:

我在Kivy应用里通过第三方.NET DLL初始化一些仪器设备,其中有个DLL的表现特别差——初始化要花好几秒。为了保持GUI响应,我试着把仪器初始化放到了单独的线程里,但GUI还是会卡住。

我确定就是这个特定仪器的DLL导致的,因为把它从配置里去掉后,GUI就一直保持响应了。另外,如果我把每个仪器的初始化换成time.sleep(3)加打印操作,就能看到预期的行为:init_instruments_in_background()在后台执行,全程GUI都没问题。

我是不是在尝试一件根本不可能的事?会不会这个第三方DLL本身就没办法在单独线程里运行而不阻塞主线程?我猜测这个DLL执行慢的原因是TCP/IP telnet通信的超时延迟。我的环境是Windows 10,Python 3.12.4,Kivy 2.3.0。

Kivy主部件中的代码

def init_instruments_in_background(self):

    # instruments是定义在Instrument1.py、Instrument2.py等文件中的类
    for instr in ['Instrument1', 'Instrument2', 'Instrument3']:
        globals()[instr] = __import__(instr)
        # 这个操作在某个仪器的情况下会阻塞主线程
        self.Instruments[instr] = globals()[instr].Instrument(<ip_addr>, <port>)

def init_instruments(self):
    equip_thread = Thread(target=self.init_instruments_in_background, daemon=True)
    equip_thread.start()

self.init_instruments()

InstrumentX.py类的结构

import clr 
class Instrument:

    def __new__(self, ip_addr, port):

        clr.AddReference('<name_of_.NET_instrument_driver_dll>')
        from <NET_instrument_driver_namespace> import InstumentX
        self.INTERFACE = InstrumentX(ip_addr, port)

        return self.INTERFACE

备注:内容来源于stack exchange,提问作者Eugene B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 18:18:01