【发布时间】:2021-04-05 10:16:03
【问题描述】:
我正在使用 Microsoft Visual Studio 2019 用 C# 编写一个应用程序。该应用程序与多个 Arduino 板通信。使用 TAP 模型异步发送和接收工作,并且工作正常。
该应用程序基于 Windows 窗体应用程序,使用 .NET Framework 4.7.2。我将 DataGridView 添加到表单中,使用 DataTable 作为 DataSource。目的是将此 DataGridView 用作数据记录器,显示 5 列:TimeStamp、DeviceID、Direction、Command 和 ErrorStatus。
如果我禁用 DataGridView,我会在中文 Arduino 克隆上达到每秒 500 条命令。在真正的 Arduino 上,我似乎每秒最多只能获得 244 个命令 - 请参阅下面关于 stackoverflow 的其他问题 - 但这不是现在的问题:
Communication speed over USB (PC/Arduino) using SerialPort in C# seems to “clip”
当我启用我的 DataGridView 时,我看到通信速度下降到大约 25 个命令/秒,这纯粹是因为更新了 DataGridView 中的行。但这似乎只是 DataGridView 开始滚动时的情况。
见下面代码sn-p:
dt.Rows.Add(new string[]
{
DateTime.Now.ToString("HH:mm:ss:fff"),
device._FMGSDevice,
action,
notifyData.Command,
notifyData.notifyError.ToString()
});
if (dt.Rows.Count > maxLines)
dt.Rows.RemoveAt(0);
dt 是用作 DataGridView 的 DataSource 的 DataTable。对于每次通信,都会在 DataTable 的末尾添加一行,然后在 DataGridView 中自动更新。
maxLines 是当前设置为 500 的常数。为了避免我的 DataGridView 获得太多行,我将其限制为 500 行。如果达到限制,我会在添加新行后使用“RemoveAt(0)”删除第一行,以使其保持在最多 500 行。
我现在看到,一旦 DataGridView 开始滚动(“RemoveAt(0)”导致所有行都向上移动一行),速度会急剧下降。
有人知道如何加快滚动速度吗? 或者还有其他项目可以用来记录吗? (虽然,我也需要过滤)。
【问题讨论】:
-
DGV 不会是我实现此日志记录的首选。你是在窗口线程上发送命令吗?
-
也许你必须有一个列表/表格来保存数据,但在网格中只显示 20 或 30 行。滚动时,然后更新网格。
-
尝试双缓冲 DGV!
-
@CaiusJard 不,通信使用基于异步任务的实现。
标签: c# winforms datagridview