在主线程中从子类化线程进行回调

时间:2012-02-01 16:28:57

标签: python multithreading pyqt4

我有一个继承自threading.Thread的类。 在处理队列中的项目后,我希望它调用一个函数,我在启动它时将其移交给线程。从run-Method执行该回调将使其在我的工作线程中运行。有没有办法在MainThread中运行该回调?

谢谢&问候, 肖恩

3 个答案:

答案 0 :(得分:3)

你没有提到你正在使用pyqt。 Qt内置了信号和插槽,仅用于此目的。如果你使用QThread启动你的线程,那么它有一个'完成'信号,你的主线程可以连接到一个插槽。如果您需要对结果信号进行更多控制,您可以从线程中以您想要的任何值发出自定义信号。构造线程时,只需将其信号连接到要作为回调的插槽即可。 否则,如果您专门等待线程,则会阻止主事件循环。

以下是有关新款式信号/广告位的链接:http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/new_style_signals_slots.html

现在可以非常轻松地创建一个具有所需签名的python信号,并以面向对象的方式将其连接到插槽。

另外作为关于PyQt的旁注...这里的其他一些答案建议在主线程上创建一个循环,等待从其调度的线程收集队列中的响应。这基本上就是PyQt所做的。当您启动应用程序时,主线程进入事件循环。此事件循环正在处理在其事件队列中堆叠的事件。有不同类型的信号/插槽连接。如果您的两个端点在同一个线程中,那么将进行直接连接,并且发射信号将调用该插槽。如果它们位于不同的线程中,那么我相信它会通过事件循环,以便可以在发射器线程之外进行处理。

答案 1 :(得分:0)

将方法推送到队列中,让主线程坐下并等待该队列,运行每个方法,因为它将它们拉下来。

答案 2 :(得分:0)

您可以使用条件变量并让主线程等待来自子线程的消息。子线程可以通知主线程调用该方法。

相关问题