我正在编写一个应用程序,以 250kb /秒的速率显示串行/ USB数据。我正在使用.net SerialPort 类并对DataReceived
事件做出反应。对于此软件的早期实现,我只是将传入的数据存储在 WinForms RichTextBox
中。此解决方案正常工作,直到控件中有 50k - 100k行,此时应用程序陷入困境。从那以后,我尝试用 WPF 完成我的目标,并发现了同样的问题。我曾试图在文本框中仅保留当前可见的文字,并将其余内容存储在大List<string>
中,但这个解决方案需要一个巨大的解决方法的数量,最后被放弃了 - 我宁愿不重新发明轮子。
现在我来找你一个希望的线索 - 我愿意尝试任何事情!我应该使用自定义控件(欢迎付费和免费控制)?的 SQLite的? 虚拟化如上所述?我应该尝试轮询SerialPort 而不是对事件作出反应吗?
答案 0 :(得分:5)
使用线程读取数据并将其直接写入文件。让您的应用经常刷新文件中的最后x行数。甚至可能根据读者线程的通知进行刷新?
通过使用多个线程,您可以保持UI响应,并通过直接写入文件,您将确保收集了所有数据。此外,它还允许您暂停显示足够长的时间,以便在继续捕获数据的同时实际复制/粘贴所需的数据。
可能您可以实现自己的文件阅读器类型,允许用户通过仅加载您可以在屏幕上实际显示的部分来“滚动”文件。
答案 1 :(得分:4)
如果数据主要是面向行的(ReadLine),则将其放在ListBox中。它是在屏幕上放置大量文本的最快控件。
但是你会发现所有的UI控件都是针对人机交互的,而不是针对端口的速度。最好的办法是重新考虑你的设计。无论如何,这些数据是什么?