2012-02-01 84 views
0

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

感谢&问候, 肖恩

回答

0

推的方法到一个队列,并有主线程好整以暇该队列,运行的每个方法,因为它拉他们。

0

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

+0

感谢您的回复。 问题是,我将不得不保持执行我的MainThread(保存Qt4 GUI),直到工作线程完成并且会导致GUI无响应(工作线程正在执行数据库相关的工作,时间) – forellenfuerst 2012-02-01 16:37:36

+0

请参阅我对pyqt特定解决方案的回答。我认为你alao可能需要阅读更多关于使用pyqt的信息 – jdi 2012-02-01 16:51:26

3

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

这里是关于新型信号/插槽具体的链接:http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/new_style_signals_slots.html

这使得它现在非常容易创建任何你想要的签名蟒蛇信号,并以面向对象的方式连接到插槽。

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