【问题标题】:Why does QThread only print one of two thread calls?为什么 QThread 只打印两个线程调用之一?
【发布时间】:2015-04-25 18:25:56
【问题描述】:
from PySide.QtCore import *
from PySide.QtGui import *
import time as t


class WorkerThread(QThread):
    def _init_(self, mw):
    super(WorkerThread, self)._init_(mw)
    self.gameName = ""

def setGameName(self, currGameName):
    self.gameName = currGameName

def run(self):
    print self.gameName

class GG(object):
workerThread = WorkerThread()
def startThread(self,stringer):
    self.workerThread.setGameName(stringer)
    self.workerThread.start()

harro = GG()
harro.startThread("hello")
harro.startThread("hi")
t.sleep(60)

这只会打印“hi”而不是“hello”。为什么不打印两者?我将如何更改它以使其同时打印?

【问题讨论】:

    标签: python pyqt pyside qthread


    【解决方案1】:

    第二次调用startThread 取消了第一次。该线程没有时间打印“hello”,您再次调用它要求打印“hi”。 您可以在QThread.start() 之后调用QThread.wait() 以等待线程完成。

    一个工作示例(也有正确的标识):

    class WorkerThread(QThread):
        def _init_(self, mw):
            super(WorkerThread, self)._init_(mw)
            self.gameName = ""
    
        def setGameName(self, currGameName):
            self.gameName = currGameName
    
        def run(self):
            print self.gameName
    
    class GG(object):
         workerThread = WorkerThread()
    
         def startThread(self,stringer):
            self.workerThread.setGameName(stringer)
            self.workerThread.start()
            self.workerThread.wait()
    
    harro = GG()
    harro.startThread("hello")
    harro.startThread("hi")
    

    此示例将在线程运行时冻结用户界面。 所以对于更复杂的任务,你应该使用信号和槽机制。

    【讨论】:

      【解决方案2】:

      这个例子很小,线程只做一件事(打印一个字符串),然后退出。如果您真的想并行启动两个线程,您可以修改您的 GG 类以跟踪多个线程对象。

      class WorkerThread(QThread):
          def _init_(self, mw):
              super(WorkerThread, self)._init_(mw)
              self.gameName = ""
      
          def setGameName(self, currGameName):
              self.gameName = currGameName
      
          def run(self):
              print self.gameName
      
      class GG(object):
           workerThreads = []
      
           def startThread(self,stringer):
              self.workerThreads.append(WorkerThread())
              self.workerThreads[-1].setGameName(stringer)
              self.workerThreads[-1].start()
      
      harro = GG()
      harro.startThread("hello")
      harro.startThread("hi")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-25
        相关资源
        最近更新 更多