运行 在 kivy 中非常频繁地运行 (Kivy Clock/FreeClock)
Running functions in kivy extremely frequently (Kivy Clock/FreeClock)
我正在开发一个从蓝牙设备获取数据的应用程序(我只是通过串行模块处理)。我知道该怎么做。但是在 Kivy 中赋予它新的生命 - 显示它 - 会产生一个问题,即一切都与 FPS 同步。我想 运行 该功能一直在后台运行,每秒数百次。公平地说,在 10000 个传入数据包中,有 10 个可能有用。因此,如果我要按时钟调度进行,则每个周期必须(很好)低于 20 毫秒。
简单地说: 我如何运行将其中一个功能从FPS中分离出来?有没有一种简单的方法可以将时钟的免费版本仅用于一个功能,它是如何实现的?
我想要一个简单的解决方案,我可以重新发明轮子,但我不想。
感谢任何帮助,谢谢。
您可以为此使用 threading
。
这是一个使用 threading
和 kivy 的小例子:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock
from kivy.properties import NumericProperty
import threading
import time
Builder.load_string('''
<MyLayout>:
Label:
text: str(root.data)
''')
class MyLayout(BoxLayout):
data = NumericProperty(0)
count = 0
running = True
def __init__(self,**kwargs):
super(MyLayout,self).__init__(**kwargs)
Clock.schedule_once(self.after_init)
def after_init(self, dt):
threading.Thread(target=self.func).start()
def func(self):
while self.running:
self.data += 1
time.sleep(0.1)
class MyApp(App):
def build(self):
self.root = MyLayout()
return self.root
def on_stop(self):
self.root.running = False
MyApp().run()
我正在开发一个从蓝牙设备获取数据的应用程序(我只是通过串行模块处理)。我知道该怎么做。但是在 Kivy 中赋予它新的生命 - 显示它 - 会产生一个问题,即一切都与 FPS 同步。我想 运行 该功能一直在后台运行,每秒数百次。公平地说,在 10000 个传入数据包中,有 10 个可能有用。因此,如果我要按时钟调度进行,则每个周期必须(很好)低于 20 毫秒。
简单地说: 我如何运行将其中一个功能从FPS中分离出来?有没有一种简单的方法可以将时钟的免费版本仅用于一个功能,它是如何实现的?
我想要一个简单的解决方案,我可以重新发明轮子,但我不想。
感谢任何帮助,谢谢。
您可以为此使用 threading
。
这是一个使用 threading
和 kivy 的小例子:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock
from kivy.properties import NumericProperty
import threading
import time
Builder.load_string('''
<MyLayout>:
Label:
text: str(root.data)
''')
class MyLayout(BoxLayout):
data = NumericProperty(0)
count = 0
running = True
def __init__(self,**kwargs):
super(MyLayout,self).__init__(**kwargs)
Clock.schedule_once(self.after_init)
def after_init(self, dt):
threading.Thread(target=self.func).start()
def func(self):
while self.running:
self.data += 1
time.sleep(0.1)
class MyApp(App):
def build(self):
self.root = MyLayout()
return self.root
def on_stop(self):
self.root.running = False
MyApp().run()