• 7035阅读
  • 6回复

[提问]问个PyQT多线程的问题 [复制链接]

上一主题 下一主题
离线weakness_kh
 
只看楼主 倒序阅读 楼主  发表于: 2011-05-06
import test

class QThreadEx(QtCore.QThread):
    def __init__(self, parent = None):
        super(QThreadEx, self).__init__(parent)
        
    def run(self):
        self.exec_()
    
class waitSerchDialog(QtGui.QDialog):
    def __init__(self, parent = None):
        super(waitSerchDialog, self).__init__(parent)
        
        self.t = QThreadEx()  //创建新线程
        self.test = test.test()  //创建test对象
        self.test.moveToThread(self.t)  //加入新线程
        self.test.connect(self.t, QtCore.SIGNAL("started()"), QtCore.SLOT("do_test()"))  //线程开始时调用do_test()
        self.test.finish.connect(self.t.quit)
#      self.test.connect(self.test, QtCore.SIGNAL("finished()"), self.t, QtCore.SLOT("quit()"))

        self.testGroup = QtGui.QGroupBox()
        self.button = QtGui.QPushButton(self.testGroup)
        
        mainLayout = QtGui.QVBoxLayout()
        mainLayout.addWidget(self.testGroup)
        self.setLayout(mainLayout)
        self.setWindowTitle(u"系统配置")
        self.t.start()

另外在test.py中定义了一个singal:    finish,在do_test()结束时用emit发出信号
把do_test()做成了slot

像上面那样的代码,我在do_test()发出自定义的finish信号之后又用print进行测试,发现print依然能够打印出东西。
故想问QThread自带的finished()信号是什么时候发出的?
另外自带的quit()槽是否会立即杀死线程,还是别的作用?我上面那样去调用有没有错误

[ 此帖被weakness_kh在2011-05-06 16:28重新编辑 ]
离线weakness_kh
只看该作者 1楼 发表于: 2011-05-06
刚试过用terminate槽去代替quit了。发现print后的东西出不来了。
那quit是做什么的?什么时候才将线程退出?
离线dbzhang800

只看该作者 2楼 发表于: 2011-05-06
引用第1楼weakness_kh于2011-05-06 16:26发表的  :
刚试过用terminate槽去代替quit了。发现print后的东西出不来了。
那quit是做什么的?什么时候才将线程退出?

terminate 是杀死线程(所以,不到万不得已,你最好不要用它)

quit 是退出线程(事件循环),如果你的操作耗时,不能及时回到事件循环,它就无能为力了。
离线weakness_kh
只看该作者 3楼 发表于: 2011-05-06
回 2楼(dbzhang800) 的帖子
那好比我做两个button
一个用来start线程,一个用来取消。取消的话我可以用terminate?
quit的话,我后台的操作是有些耗时,那就算不能及时回到事件循环它最后也会退出吗?
[ 此帖被weakness_kh在2011-05-06 16:49重新编辑 ]
离线dbzhang800

只看该作者 4楼 发表于: 2011-05-06
Re:回 2楼(dbzhang800) 的帖子
引用第3楼weakness_kh于2011-05-06 16:49发表的 回 2楼(dbzhang800) 的帖子 :
那好比我做两个button
一个用来start线程,一个用来取消。取消的话我可以用terminate?
quit的话,我后台的操作是有些耗时,那就算不能及时回到事件循环它最后也会退出吗?

1. 这样的话,就不要用事件循环了。自己做标记判断吧(设置个 stop标记,在run中检查该标记)。
离线weakness_kh
只看该作者 5楼 发表于: 2011-05-06
回 4楼(dbzhang800) 的帖子
谢谢~
离线weakness_kh
只看该作者 6楼 发表于: 2011-05-06
回 4楼(dbzhang800) 的帖子
还是没搞定。我是在do_test里做了个标记,用了另一个singnal-slot去更改标记。结果发现这个do_test函数是一个原子操作?是我没理解清楚意思吗,能不能讲详细些要改哪里?
快速回复
限100 字节
 
上一个 下一个