【问题标题】:Kivy Desktop App for Serial Data communication in fastest possible wayKivy 桌面应用程序以最快的方式进行串行数据通信
【发布时间】:2021-04-06 16:10:35
【问题描述】:

我使用 RecycleView 构建了基本应用程序,以在 Windows 10 上显示 SerialPort 传入消息。除了 CPU 使用率上升到 60% 以上并且电源使用率“非常高”之外,一切正常。此外,除了 MainThread,我找不到更新 GUI 的方法。这是所需的代码sn-ps:

            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更轻的视图吗?

我的意思是,在没有任何 CPU 或高功率使用的情况下,以下工作非常出色:

self.ids.lbl.text = serialString.decode('utf-8', 'replace')

但执行以下操作会导致 CPU 使用率和功耗较高:

self.ids.lbl.text += serialString.decode('utf-8', 'replace')

注意 += 在第二行。

【问题讨论】:

    标签: python-3.x kivy kivy-language kivymd


    【解决方案1】:

    您每次都在重新生成整个数据列表,随着列表大小的增加,这将变得越来越昂贵,相反,您应该尝试仅追加(就像您为 data_list 所做的那样,并且只重新生成 @ 987654323@ from data_list 真正需要时,这应该会在消息开始堆积时提高 CPU 使用率。

    这个例子可能会有所帮助https://gist.github.com/tshirtman/41e533d077567762b3bd981f718f3cd6

    【讨论】:

    • 感谢您的回复。即使我摆脱了 RecycleView 并只使用了一个标签。在没有任何 CPU 或高功率使用的情况下,以下工作非常出色:self.ids.lbl.text = serialString.decode('utf-8', 'replace') 但是执行以下操作会导致高 CPU 使用率和功耗:self.ids.lbl。 text += serialString.decode('utf-8', 'replace') 注意 += 在第二行。
    • 与您的问题相比,这不是一个新信息,这并不令人惊讶,我的建议仍然有效,原因完全相同。
    猜你喜欢
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多