仅具有一个线程的多线程程序的锁定机制

时间:2016-08-20 06:20:52

标签: python multithreading pygame locking python-multithreading

我遇到一个线程在运行单个线程的线程程序中访问它自己的DS时遇到问题。

我正在使用这个关于pygame。 此特定类具有“颜色”值,并通过修改与“颜色”关联的RGB值,将“颜色”从“日出”更改为“蓝天”到“黄昏”到“日落”再到“夜晚”并再次返回“

以下是示例代码

class bottomMostLayer(threading.Thread):                                                                                                                                                                    
  def __init__(self, data):                                                   
    threading.Thread.__init__(self)                                                                                                                                
    self.r = 174                                               
    self.g = 232                                               
    self.b = 251
    self.color = [self.r, self.g, self.b]
    self.doIQuit = False

  def setDoIQuit(self, val):
    self.doIQuit = val

  def run(self):    
    seq = [[174, 232, 251], [143, 164, 191], [247, 93, 35], [0, 24, 72],    
           [247, 93, 35]]                                                   
    lenSeq = len(seq)                                                       
    i = 0                                                                   
    while not self.doIQuit:                                                 
        if i < (lenSeq - 1):                                                
            print('changing to %s' % (i))                                                                                                
            self.changeSky(seq[i])                                                          
            i += 1                                                          
        else:                                                               
            print('changing to 0')                                                          
            self.changeSky(seq[0])                
            i = 0

   def changeSky(self, B):
    # determine if I need to add or sub R, G, B values to get from 
    # self.r to B[0], self.g to B[1] and self.b to B[2]
    # LOCK.acquire()
    opR = [ self.r.__add__ if self.r < B[0] else self.r.__sub__ ][0] 
    opG = [ self.g.__add__ if self.g < B[1] else self.g.__sub__ ][0]        |
    opB = [ self.b.__add__ if self.b < B[2] else self.b.__sub__ ][0]
    # LOCK.release()

    doneR = doneG = doneB = False                                           | 
    while not self.doIQuit:
      # if self.r equals B[0] and self.g equals B[1] and self.b equals B[2]
      # return
      # else, 
      # add/sub self.r, self.g, self.b by small 'x'
      # update self.color to be [self.r, self.g, self.b]
      # pygame.time.wait(someTime)
      # loop back the while until either player quits or rgb is equal to 
      # our desired color               

        # LOCK.acquire()                                                    
        if self.r == B[0]: doneR = True                                     
        if self.g == B[1]: doneG = True                                     
        if self.b == B[2]: doneB = True                                     
        # LOCK.release()                                                    

        if doneR and doneG and doneB:                                       
            print('done changing sky')                                      
            return                                                          
        # LOCK.acquire()                                                    
        if not doneR:                                                       
            print('changing R')                                             
            self.r = opR(10)                                               
            print('r', self.r)                                              
        if not doneG:                                                       
            print('changing G')                                             
            self.g = opG(10)                                                
            print('g', self.g)                                              
        if not doneB:                                                       
            print('changing B')                                             
            self.b = opB(10)                                                
            print('b', self.b)                                              
        self.color = [self.r, self.g, self.b]                               
        # LOCK.release()                                                    
        print('wainting 100ms')                                             
        pygame.time.wait(5)

我注意到第一次,self.r,self.g,self.b中的值发生了变化,但在此之后,代码似乎正在接收原始RGB值,并且它们会无限地更改为相同的数字!

我确实尝试锁定访问self.r,self.g,self.b的代码,但代码等待永远获取锁定。

我很困惑为什么会这样。我认为你不需要锁来访问你自己的数据结构。此外,无论如何只有一个线程在运行。

有人可以解释我的错误吗?

PS:这是我的第一个线程编程。

0 个答案:

没有答案