在主线程中从子类线程回调
我有一个类,它是从 threading.Thread 这个类继承来的。处理完队列中的一个项目后,我想让它调用一个我在启动线程时传给它的函数。如果我在 run 方法里调用这个函数,它会在我的工作线程中运行。有没有办法让这个函数在主线程中运行呢?
谢谢,问候,
肖恩
3 个回答
把这个方法放到一个队列里,然后让主线程在那儿等着,从队列里一个一个取出方法来执行。
你可以使用条件变量,让主线程等待来自子线程的消息。子线程可以通知主线程去调用那个方法。
你一开始没有提到你在用pyqt。Qt里面有信号和槽的功能,专门用来处理这种情况。如果你是用QThread来启动线程,那么它有一个叫'finished'的信号,你可以把这个信号连接到主线程的一个槽上。如果你想对信号有更多的控制,可以在线程中发出一个自定义的信号,带上你想要的任何值。创建线程的时候,只需要把它的信号连接到你想要作为回调的槽上就行了。否则,如果你特意在等待线程的结果,就会阻塞主事件循环。
这里有一个关于新风格信号/槽的链接:http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/new_style_signals_slots.html
现在创建一个Python信号并用你想要的方式连接到槽上变得非常简单,完全可以用面向对象的方式来做。
另外,关于PyQt的一个小提示……这里的一些其他回答建议在主线程上创建一个循环,等待从派发的线程中收集响应。这其实就是PyQt的工作方式。当你启动应用时,主线程会进入一个事件循环。这个事件循环会处理堆积在事件队列中的事件。信号/槽连接有不同的类型。如果你的两个端点在同一个线程中,那么会直接连接,发出的信号会调用槽。如果它们在不同的线程中,我认为会通过事件循环来处理,这样可以在发出信号的线程之外进行处理。