• 5210阅读
  • 2回复

[提问]问一个信号槽的问题 [复制链接]

上一主题 下一主题
离线weakness_kh
 
只看楼主 倒序阅读 楼主  发表于: 2011-10-27
用的pyQT4去做的。后台线程大概:
class Back(QtCore.QObject):
    self.flag = False
    ...
    def stoplisten(self):
        self.flag = True

    def startlisten(self):
        while True:
            if self.flag:
                #socket.close()
                self.flag = False
                return
            else:
                ...
我在图形线程中新建立了个线程
self.t = QtCore.QThread()
self.back = Back()
self.back.moveToThread(self.t)
self.connect(self, QtCore.SIGNAL("startall()"), self.back.startlisten)
self.connect(self, QtCore.SIGNAL("stopall()"), self.back.stoplisten)
self.t.start()

通过两个按钮分别发射startall和stopall信号,现在问题出来了

本意是想通过flag的改变让后台线程在必要时刻退出循环。我记得以前做的程序也是这样搞得

但是现在只要通过startall()启动了startlisten槽之后,即使while是个空循环,在其运行的过程中,线程t就再也无法接受我主线程发出的信号了

把while循环去掉后,经测试便可正常接受start和stop信号。请问这是为什么?
离线dbzhang800

只看该作者 1楼 发表于: 2011-10-27
考虑以下场景:

假定你是话务员,任务是:接到电话就仅最快速度进行处理或者将电话转到其他人去处理。但是现在你突发奇想,接到一个电话就不停地和他聊天,哪怕你只是“嗯嗯啊啊”,其他人也打不进来吧?
离线weakness_kh
只看该作者 2楼 发表于: 2011-10-27
谢谢楼上,有段时间没有编程,犯了低级错误
暂时通过直接调用self.back.stoplisten()解决
因为只有一个线程对flag标记做了更改,所以没有设互斥锁。
快速回复
限100 字节
 
上一个 下一个