我有Python GUI,在一个for循环中,我从一些dll调用函数,该函数返回用于逐行填充tableWidget的值。所有这些都运行得很好,除了我不能在它还在填充的时候滚动表格(虽然dll函数计算每行7-8秒),所以我试着像这样处理线程:
q = Queue.Queue()
for i in (0, numberOfRows):
threading.Thread(target=self.callFunctionFromDLL, args=(arg1,arg2, q)).start()
result = q.get()
... do something with "result" and populate table row....
def callFunctionFromDLL(self, arg1, arg2, q):
result = self.dll.functionFromDLL(arg1, arg2)
q.put(result)但是,图形用户界面仍然没有响应,直到从q.get传递结果(functionFromDLL工作7-8秒,然后在图形用户界面填充行时,我可以滚动表格)。我以前并没有真正使用过线程,所以任何关于如何做到这一点的建议或例子都将不胜感激。
我也尝试过这种方法,同样的事情,当functionFromDLL工作时,gui仍然没有响应:
for i in (0, numberOfRows):
t = threading.Thread(target=self.callFunctionFromDLL, args=(arg1,arg2))
t.start()
t.join()
result = self.result
... do something with "result" and populate table row....
def callFunctionFromDLL(self, arg1, arg2):
self.result = self.dll.functionFromDLL(arg1, arg2)发布于 2012-11-27 23:10:57
如果您使用的是tkinter模块,那么您也许能够从Directory Pruner 4的实现中获得一些帮助。为了解决大多数GUI库不能很好地处理线程的问题,该配方使用了代码下面列出的一些自定义模块。模块affinity、threadbox和safetkinter为程序使用的GUI库提供了线程安全的包装。
发布于 2012-11-26 22:24:32
CPython (你可能已经有了)有一个全局解释器锁,它可以击败很多多线程。这是一个已被证明难以解决的已知问题。(更多信息请查看"Python GIL“。)其他一些实现,比如Jython,就没有这个问题。
https://stackoverflow.com/questions/13566751
复制相似问题