我在matlab中编写了一个相当大的数据采集程序,它在非常严格的时序安排上接收输入数据,并在GUI上实时绘制。我的问题是我需要一种方法让程序用户通过Web查看GUI以远程监控他们的数据。我的解决方案是每隔5秒左右快速拍摄一下GUI图形,并将该图像托管在Web服务器上。
然而,这会导致两个不可接受的问题:
打印功能太慢了 - 每次保存需要3-4秒,程序随后在每次调用'print'后落入其他例程。
由于某种原因,打印功能会导致GUI暂时失真,更改某些组件的位置并复制其他组件。它持续一秒左右,但它仍然使我的解决方案不切实际。
有没有办法解决这些问题?
编辑: * ** 对于任何感兴趣的人,我找到的最佳解决方案是使用名为Minicap的外部工具包。
答案 0 :(得分:7)
文件格式有很大不同。这是一个示例散点图
n = 1e4;
hfig = figure;
hax = plot(1:n, rand(1, n), '+');
...以及保存为不同格式的一些时间。
tic; print(hfig, 'test.bmp', '-dbmp'); toc %4.1s
tic; print(hfig, 'test.bmp', '-dbmp256'); toc %2.0s
tic; print(hfig, 'test.png', '-dpng'); toc %1.9s
tic; print(hfig, 'test.tiff', '-dtiff'); toc %0.45s
tic; print(hfig, 'test.jpg', '-djpeg'); toc %0.44s
tic; print(hfig, 'test.wmf', '-dmeta'); toc %0.42s
tiff
,jpeg
和wmf
首先是联合,但tiff文件很大,jpeg质量很糟糕,如果你不在Windows平台上,wmf会出现问题。
对于栅格格式,分辨率也会影响时序。
tic; print(hfig, 'test600.png', '-dpng', '-r600'); toc %4.2s
tic; print(hfig, 'test72.png', '-dpng', '-r72'); toc %0.31s
加快打印速度的另一个方法是删除不需要的绘图。透明度在计算上是密集的,传说也是如此。对数据进行采样而不是全部绘制将节省时间。
答案 1 :(得分:3)
对于未来挣扎于此的人来说,我为Windows平台着陆的解决方案是一个名为Minicap的小程序,它允许用户轻松捕获并保存系统命令的屏幕截图。
需要具有该图的基础Windows句柄,可以使用由超级用户Yair M. Altman编写的名为gethwnd()
的公开matlab函数来访问。
然后,您可以使用非常快速,高分辨率的数字屏幕截图,并将其保存到磁盘,如下所示:
winHandle = gethwnd(matlabFigHandle);
cmndstr = sprintf('%s','MiniCap.exe -save ','"',snapShotFileNamePath,'"',...
' -compress 9', ' -capturehwnd ', num2str(winHandle),' -exit');
system(cmndstr);
答案 2 :(得分:2)
您的解决方案是否必须是纯Matlab?使用平台工具包拍摄包含GUI的窗口的快照,并将其写入磁盘。这非常快,因为它将在一个单独的线程中应该处理你的线程问题。
答案 3 :(得分:1)
您可能不应该一直捕获,但只有在实际通过Web发出请求时才会捕获。即使这样,也不要捕获每个请求,但前提是最后一个快照的时间超过5秒。这应该有助于提高绩效。
答案 4 :(得分:1)
您可以将saveas()
您的数字作为.fig
文件(应该相当快)与MATLAB实例进行计算,然后使用不同的MATLAB实例(可能在不同的计算机上){ {1}}它为所需的格式。这样可以避免其他例程的延迟,并且打印引起的失真不会发生在“主”MATLAB实例上。
请注意,print
是一个.m文件,您可以查看该文件以查看是否有任何内容可以针对您的特定情况抛弃。例如,它会调用print
,我认为这会导致您谈论的扭曲/位置变化......也许您可以玩这个?
更新:数据是否通过网络界面?如果用户群足够小,也许你可以试着让他们教他们使用远程桌面软件,比如VNC,Teamviewer或Windows内置的终端服务器来远程查看他们的数据?