基本上,我需要一种从无限长的单独线程调用Matlab函数的方法。
首先,我意识到我可以使用TCPIP或UDP功能在两个Matlab实例之间进行通信。我将解释为什么它并没有真正帮助。
背景:我编写了一个Matlab类,作为USB设备的接口。选择Matlab是因为我需要它在Mac / Linux / Windows上运行,目标用户只熟悉Matlab。由于Matlab在各个平台上存在一些不一致之处,我没有使用DayOverviewTableDataRow.propTypes = {
costCenterBooking: costCenterBookingPropTypes
};
或BytesAvailableFcn
(我需要尽可能接近实时,并且如上所述,可能会延迟高达100毫秒发送和接收数据),而是使用定时器以固定间隔发送和轮询端口。这引入了一些开销,并且,如果用户保持主线程,则发送/接收也将停止。现在,该类最重要的功能之一是设置基于从设备接收的输入的回调。用户设置其功能和给定条件以匹配,对象将自动调用它。
问题:此对象完全在后台运行良好。但是,如上所述,它消耗了Matlab线程上的一些资源。我很好奇只需要在自己的线程上运行串行包装器和回调功能。但是,如果我将其编译为独立应用程序(适用于所有3个平台),我相信我唯一的解决方案是TCPIP / UDP通信。然后,这需要在主线程上运行的对象轮询端口以便实时处理回调 - 从而否定将其移动到独立应用程序的好处。
有什么建议吗?
答案 0 :(得分:1)
matlab中的线程是一场噩梦。我们不建议您实时做任何事情,并指出您所描述的延迟。在幕后,Matlab使用Java实现其所有平台独立性。如果你想做到这一点,你将用Java本地编写你的应用程序,并从Matlab调用你的java(以处理你的用户无法安装JRE,但可以安装matlab这一事实。)
也就是说,有一种比你正在做的更好的方法来处理回调。在这种情况下,我首选的架构是让一个线程为硬件提供服务,并通过消息队列与其他线程进行通信(一个用于输入,一个用于输出,一个用于命令/控制,如果你需要超级花哨的话。)基本上,硬件线程然后只专注于服务队列。你有第二个线程处理回调。它读取硬件线程的输出队列,并为回调提供服务。我从来没有在matlab中做到这一点(参见第一段),但它在Java上下文中运行良好。