我希望使用cypress FX2LP进行30兆字节的USB数据传输,并同时绘制它的图表。我找到了一个涵盖这个30兆字节传输速率的策略:在读取线程中读取1兆字节数据,然后在main_thread中绘制它。但是这个策略需要1兆字节的缓冲区,而我的主板上没有这样的内存。
你有其他解决方案吗?
你不需要任何线程。
将您的问题分解为更简单的步骤:
对于第1步 - 您不需要实际的转移内容,是吗?你只需要时间;基本上你想传输虚拟数据,把它放到/dev/null
但保存一对(nbytes_transferred, timestamp)
的列表,这将不会吃那么多的内存。保存,测试/验证,然后继续执行第2步。
编辑
线程UI也不是绝对必要的线程。
您所要做的就是避免阻塞/同步IO;使用异步/非阻塞方法。
在Java中,这意味着像NIO;在Qt - 也许使用QtConcurrent
和QFuture
。
实际上每个GUI工具包都基于event loop模型工作:有一个主循环滚动(通常隐藏在application.run()
调用中),它一次又一次地向操作系统查询事件(例如用户按键或鼠标使用,计时器启动,[异步]网络或磁盘IO完成或进行等),然后处理或调度这些事件,最终调用你的onButton1Click
方法, - 最后睡觉,直到有更多事件要处理。
通常情况下,还有一种方法可以挂钩到onIdle
“事件”,这个事件恰好在主循环因为不活动而休眠(为了节省CPU能量和能量)之前发生。在Qt中,这是0超时QTimer
,或QAbstractEventDispatcher::aboutToBlock()
回调。请参阅this question了解更多您喜欢的内容。
如果所有这些听起来太复杂,或许可以查看this library一些不错的公司在GitHub上开源。 (我刚刚在google上找到它;没有任何关系)。从源头看,它们似乎为Qt-onic提供了一个很好的libusb-1.0
API - 你最有可能用它来进行跨平台的USB访问。哦,他们选择了0超时QTimer
方法。