我真的很难在我的应用程序中实现线程。这可能会有点长,所以请耐心等待。我的问题更多地围绕我的应用程序的建议结构,而不是围绕添加线程的代码。
首先让我展示一下我的应用程序的视觉效果。比解释一些事情。应用程序通过串行端口上的Arduino提供数据。在坚果壳中,我打开一个串口,逐行读取数据,处理它并在屏幕上直观显示。视觉效果分为两部分。第一个是Arduino通过串口保存和传递的每个赛车的时间。第二个是比赛进展基于比赛的距离,你看到的时钟风格手也在屏幕截图中看到。这一切都是实时发生的,来自Arduino的数据通过串口发生得非常快。
比赛开始后,此功能就是我解析数据并告诉系统如何处理数据。
def letsrace(self):
def getsome():
global var1, var2, totalCount
self.reset()
self.senddemo()
letsRace = 1
ser.write('!g\n')
while (letsRace == 1):
#print mycount
s = ser.readline()
s = s.strip('\r\n')
#Check for :
pattern = r'[:]'
if re.search(pattern, s):
#print 'VALID : %r' % (s,)
var1, var2 = s.split(":")
self.options[var1]()
else:
#print 'INVALID : %r' % (s,)
pass
if totalCount == 4:
letsRace = 0
self.racecomplete()
thread = threading.Thread(target=getsome)
thread.start()
正如你所看到的,我确实有一个主题。这很有效,因为显示每个赛车的计时器会使应用程序陷入困境。一旦我在竞赛功能上添加了线程,我就没有问题了。
我还应该指出,我使用字典作为案例陈述。它属于Race类的ini。它看起来如下。
self.options = {"0": self.draw_r1,
"1": self.draw_r2,
"2": self.draw_r3,
"3": self.draw_r4,
"0f": self.racerFinish,
"1f": self.racerFinish,
"2f": self.racerFinish,
"3f": self.racerFinish,
"x": self.emptyLine,
"t": self.raceTime,
"G": self.letsGo,
"CD": self.countDown,
"C": self.emptyLine,
}
根据我从实时数据流中解析的内容,我使用正确的函数处理它。到目前为止我非常基本的东西我认为你会同意。
我刚刚完成了代码,可以在时钟式显示屏上添加赛车表盘。我正在使用Pillow(PIL)来旋转表盘。这也是非常基本的东西。我有一个画布,我在画布上添加了四个图像来表示每个赛车。我为每个赛车使用不同的功能来更新他们在比赛中的位置。它们是您在上面的词典中看到的前四个功能。以下是其中一个示例。除了他们在时钟上更新的图像之外,它们几乎都是相同的。
def draw_r4(self):
if self.r4_isdone == 0:
self.angle = (float(var2) * self.movement ) * -1
if self.angle < -360:
self.angle = 0
self.canvas.delete(self.canvas_obj4)
self.newarrow4 = ImageTk.PhotoImage(self.image_r4.rotate(self.angle))
self.canvas_obj4 = self.canvas.create_image(215, 215, image=self.newarrow4)
如果您熟悉PIL并旋转图像,您就会知道它基本上会反复重绘图形以显示新位置。这是系统现在出现问题的地方。在Win8或Mac上,拨号盘不会真正影响应用程序的性能。在具有有限处理能力的覆盆子PI上。演示比赛需要大约6.4秒才能完成,但是在RPi上,由于图像重绘的处理,大约需要15秒。为了让这个像Raspberry一样工作,我想让每个拨号动画都在自己的线程中运行。
所以,如果你还在阅读这篇文章。我为这个长度道歉。现在我的问题。您如何建议我将每个拨号运动都放入自己的线程中?请记住,上面的主要赛车功能有一个线程。我读过的每个线程示例都是如此基本,以至于在一个完整的gui应用程序中实现任何东西都让我的头脑旋转了一下。