以最快的方式进行串行数据通信的 Kivy 桌面应用程序
Kivy Desktop App for Serial Data communication in fastest possible way
我使用 RecycleView 构建基本应用程序以在 Windows 10 上显示 SerialPort 传入消息。一切正常,除了 CPU 使用率上升到 60% 以上并且电源使用率“非常高”高的”。此外,除了 MainThread 之外,我找不到更新 GUI 的方法。以下是所需的代码片段:
RecycleView:
id:rv
do_scroll_x: False
smooth_scroll_end:10
do_scroll_y: True
bar_color: 105/255,105/255,105/255, 1
bar_inactive_color: 105/255,105/255,105/255, 1
bar_width:15
scroll_type:['bars', 'content']
viewclass: 'Label'
color: '#000000'
RecycleBoxLayout:
default_size: None, dp(56)
default_size_hint: 1, None
size_hint_y: None
height: self.minimum_height
orientation: 'vertical'
color: '#000000'
以及每 2 毫秒运行一次以从端口读取字节的函数:
@mainthread
def read_data(self, *args):
if(self.serial_port.in_waiting > 0):
serialString = self.serial_port.read_all()
self.data_list.append(serialString.decode('utf-8', 'replace'))
self.ids.rv.data = [{'text': str(x)} for x in self.data_list]
以上代码给出了超过 CPU 和电源问题。如果我只用一个标签替换 .kv 文件中的 RecycleView 以显示单个传入字符串(而不是附加它),CPU 和功耗会急剧下降到几乎 1%。请指导我以附加模式在主 GUI 上显示所有传入消息的方法,以便用户可以上下滚动以查看所有消息。有没有比Label更清爽的view?
我的意思是在没有任何 CPU 或高功率使用的情况下,以下工作非常出色:
self.ids.lbl.text = serialString.decode('utf-8', 'replace')
但是执行以下操作会使 CPU 使用率和功耗增加:
self.ids.lbl.text += serialString.decode('utf-8', 'replace')
第二行注意+=。
您每次都在重新生成整个数据列表,随着列表大小的增加,这将变得越来越昂贵,相反,您应该尝试仅附加(就像您对 data_list
所做的那样),并且仅在真正需要时从 data_list
重新生成 rv.data
,当消息开始堆积时,这应该会改善 cpu 使用情况。
这个例子可能会有帮助https://gist.github.com/tshirtman/41e533d077567762b3bd981f718f3cd6
我使用 RecycleView 构建基本应用程序以在 Windows 10 上显示 SerialPort 传入消息。一切正常,除了 CPU 使用率上升到 60% 以上并且电源使用率“非常高”高的”。此外,除了 MainThread 之外,我找不到更新 GUI 的方法。以下是所需的代码片段:
RecycleView:
id:rv
do_scroll_x: False
smooth_scroll_end:10
do_scroll_y: True
bar_color: 105/255,105/255,105/255, 1
bar_inactive_color: 105/255,105/255,105/255, 1
bar_width:15
scroll_type:['bars', 'content']
viewclass: 'Label'
color: '#000000'
RecycleBoxLayout:
default_size: None, dp(56)
default_size_hint: 1, None
size_hint_y: None
height: self.minimum_height
orientation: 'vertical'
color: '#000000'
以及每 2 毫秒运行一次以从端口读取字节的函数:
@mainthread
def read_data(self, *args):
if(self.serial_port.in_waiting > 0):
serialString = self.serial_port.read_all()
self.data_list.append(serialString.decode('utf-8', 'replace'))
self.ids.rv.data = [{'text': str(x)} for x in self.data_list]
以上代码给出了超过 CPU 和电源问题。如果我只用一个标签替换 .kv 文件中的 RecycleView 以显示单个传入字符串(而不是附加它),CPU 和功耗会急剧下降到几乎 1%。请指导我以附加模式在主 GUI 上显示所有传入消息的方法,以便用户可以上下滚动以查看所有消息。有没有比Label更清爽的view?
我的意思是在没有任何 CPU 或高功率使用的情况下,以下工作非常出色:
self.ids.lbl.text = serialString.decode('utf-8', 'replace')
但是执行以下操作会使 CPU 使用率和功耗增加:
self.ids.lbl.text += serialString.decode('utf-8', 'replace')
第二行注意+=。
您每次都在重新生成整个数据列表,随着列表大小的增加,这将变得越来越昂贵,相反,您应该尝试仅附加(就像您对 data_list
所做的那样),并且仅在真正需要时从 data_list
重新生成 rv.data
,当消息开始堆积时,这应该会改善 cpu 使用情况。
这个例子可能会有帮助https://gist.github.com/tshirtman/41e533d077567762b3bd981f718f3cd6