代码非常庞大,因此我将只发布一些片段。
最终,这归结为我遍历的列表,无论是打印每个元素还是使用:
我这样做是为了能够管理这4个线程,并能够知道它们何时完成。
class Program(QtGui.QWidget):
def __init__(self, parent=None):
super(Program, self).__init__(parent)
...
def main():
app = QtGui.QApplication(sys.argv)
global ex
ex = Program()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
在这些标签、文本框、按钮和4个QListWidgets之间,我有一堆子布局,这些子布局被添加到网格中。
根据输入,我启动了可变数量的线程。通常是4个线程。它们在自己的类中启动:
class myThread(Thread):
def __init__(self, arguments, more_arguments):
threading.Thread.__init__(self)
def work_it(self, argument, more_arguments):
Program.some_function_in_Program_class(ex, arguments)
然后我从那里调用Program()类内部的函数来实际改变GUI。
Program.generate_results(ex, arguments, arguments2, more_arguments)
最终,这归结为我遍历的列表,无论是打印每个元素还是使用:
my_listbox.addItem(item)
它会冻结GUI,直到所有4个线程都完成列表的遍历。然后所有结果一起出现,而不是一个接一个地出现。
我在Tkinter中做过这个,我可以看到一个接一个的列表项动态地出现在ListBox小部件中,而不会冻结GUI。
至于线程管理,我的做法是遍历一个列表,并根据其长度创建多个线程:
threadlist = []
for i in self.results:
sub_thread = myThread(i, self.results[i])
self.threadlist.append(sub_thread)
swapAndWaitThread = spawnAndWaitThreadsThread(self.threadlist)
swapAndWaitThread.start()
我这样做是为了能够管理这4个线程,并能够知道它们何时完成。
class spawnAndWaitThreadsThread(Thread):
def __init__(self, threadlist):
threading.Thread.__init__(self)
self.threadlist = threadlist
def run(self):
for thread in self.threadlist:
thread.start()
for thread in self.threadlist:
thread.join()
print "threads finished.. do something"
我做错了什么?
threading.thread
继承的线程,您需要将所需代码放在其“运行”方法中,然后在某个时刻调用start
。出现在__init__方法中的代码仍将在主线程中运行。 - Kevinrun
定义中,并像thread.start(args = (my_program_instance,))
这样启动线程,以获取程序实例。但是全局变量也应该可以工作。总的来说,我认为你的spawnAndWaitThreadsThread
看起来还不错。我认为下一个可能出现问题的地方是在myThread
内部。 - Kevin