2015-02-24 31 views
1
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) 

这只打印“嗨”而不打“你好”。为什么不能同时打印?我将如何改变它以便同时打印?为什么QThread只打印两个线程中的一个?

回答

4

第二次致电startThread取消第一个。该线程没有时间打印“你好”,你再次打电话问打印“嗨”。 您可以在QThread.start()之后立即致电QThread.wait()等待线程完成。

一个工作例子(也与正确identation):

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") 

线程运行时,该实施例将冻结的用户接口。 因此,对于更复杂的任务,您应该使用信号和插槽机制。

0

这个例子很小,因为线程只做一件事(打印一个字符串),然后退出。如果你真的想同时启动两个线程,你可以修改你的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") 
相关问题