从主函数向线程发送信号?

Posted

技术标签:

【中文标题】从主函数向线程发送信号?【英文标题】:Sending a signal from main function to a thread? 【发布时间】:2014-10-10 06:55:07 【问题描述】:

我正在使用 Pyqt4 在 python 中制作 GUI。我想从主 GUI 向线程发送信号以创建函数。我知道如何将信号从线程发送到主 GUI,但我不知道相反的事情。我也想用信号传递一个变量。

类似:

class MainGUI()
     def function
         value = 5
         self.emit(QtCore.Signal("Signal(int)"),value)


class thread(QtCore.QThread)
     def _init_(self)
          Qtcore.QThread._init_()
          self.connect(Qt.SIGNAL("Signal(int)"),self.run())

     def run(self,value):
         time.sleep(value)

因此,每次从主 GUI 传输信号时,我都希望在线程中并行运行该函数,而不会冻结 GUI。

任何帮助将不胜感激, 喷射

【问题讨论】:

【参考方案1】:

正确的方法是创建将被移动到线程的对象。你不需要继承QtCore.QThread

或多或少是这样的(免责声明:我比 Python 更喜欢 C++):

myThread = QtCore.QThread()
testObject = YourClassWithSlots() # NO PARENT HERE
testObject.moveToThread(myThread)
myThread.start()

从那时起,testObject(具有默认连接类型)的所有已连接插槽将在线程 myThread 中运行。

有用的链接:

http://blog.qt.io/blog/2010/06/17/youre-doing-it-wrong/ http://doc.qt.io/qt-5/qt.html#ConnectionType-enum http://doc.qt.io/qt-5/qobject.html#moveToThread

更多细节请@Ezee

class YourClassWithSlots(QtCore.QObject) :
    @Slot(int)
    def havyTaskMethod(self, value) :
         # long runing havy task
         time.sleep(value)

self.myThread = QtCore.QThread(self)
self.testObject = YourClassWithSlots() # NO PARENT HERE
self.testObject.moveToThread(myThread) # this makes slots to be run in specified thread
self.myThread.start()
self.connect(Qt.SIGNAL("Signal(int)"), self.testObject.havyTaskMethod)

【讨论】:

问题是关于发送信号而不是关于使用线程。所以这不是一个答案。在这种情况下,OP 的下一个问题是“如何从移动到另一个线程的对象发送信号” 在投票之前阅读我给出的链接。看来你喜欢复仇。请注意,即使在编辑之后,您的答案也很糟糕。 @Jetmir 应该了解信号和插槽的功能(您也应该了解),那么他的问题将很容易解决。 链接可以提供更多信息,但不能提供答案。添加一些回答 OP 问题的内容,投票将被删除。想想也更有礼貌。 这里有更多详细信息。 你不需要从QThread继承YourClassWithSlots

以上是关于从主函数向线程发送信号?的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5:如何向工作线程发送信号

无法从主进程向 Electron Renderer 进程发送函数

在C ++中是否可以从主线程中执行辅助线程中运行的函数?

从主线程触发一个线程中的动作的防弹方法?

block的是发送信号的线程,又不是处理槽函数的线程

从主窗口的菜单向 qt tabWidget 发送文件名