我遇到一个线程在运行单个线程的线程程序中访问它自己的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:这是我的第一个线程编程。