2

我有 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 传递结果之前 GUI 仍然没有响应(functionFromDLL 工作 7-8 秒,并且在 GUI 填充行时我可以滚动表格)。我之前并没有真正使用过线程,所以任何建议或示例如何做到这一点将不胜感激。

我也试过这种方式,同样的事情,当 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)
4

2 回答 2

2

如果您正在使用该tkinter模块,您可能会从Directory Pruner 4的实施方式中获得一些帮助。为了解决大多数 GUI 库不能很好地与线程一起使用的事实,该配方利用了代码下方列出的一些自定义模块。模块affinitythreadboxsafetkinter提供程序使用的 GUI 库的线程安全包装。

于 2012-11-27T15:10:56.950 回答
0

CPython(你可能拥有的)有一个全局解释器锁,它打败了很多多线程。这是一个已证明难以解决的已知问题。(查找“Python GIL”以获取更多信息。)其他一些实现,例如 Jython,没有这个问题。

于 2012-11-26T14:24:32.470 回答