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
相关产品推荐
相关产品推荐

