Domanda

Ho scritto un gran programma di acquisizione dati in MATLAB che riceve i dati di input su un programma di tempi piuttosto stretto e trame in tempo reale sulla GUI. Il mio problema è che ho bisogno di un modo per gli utenti del programma per visualizzare l'interfaccia grafica sul web per monitorare i loro dati da remoto. La mia soluzione era quella di prendere un colpo a scatto della figura GUI ogni 5 secondi o giù di lì e host che immagine su un server web.

Tuttavia questo porta a due problemi inaccettabili:

  1. La funzione di stampa è semplicemente troppo slow-- ci vuole ~ 3-4 secondi per ogni salvataggio e il programma in seguito cade dietro nella sua altre routine dopo ogni chiamata a 'print'.

  2. Per qualche motivo la funzione di stampa fa sì che la GUI per essere temporaneamente distorta, cambiando la posizione di alcuni componenti e duplicazione altri. Dura solo per un secondo o poco più, ma fa ancora la mia soluzione impraticabile.

C'è un modo per risolvere uno di questi problemi?

EDIT: * ** a chiunque sia interessato, la soluzione migliore che ho trovato è stato quello di utilizzare un toolkit esterno chiamato Minicap .

È stato utile?

Soluzione 2

Per tutti coloro che lottano con questo in futuro la soluzione che ho atterrato su per le piattaforme Windows è un piccolo programma chiamato Minicap che permette di catturare e salvare facilmente le immagini con i comandi di sistema.

Si ha la necessità di avere il manico di Windows sottostante della figura, a cui si accede utilizzando la funzione di MATLAB a disposizione del pubblico chiamato gethwnd() scritto da superutente Yair M. Altman.

Si può quindi prendere una molto veloce, ad alta risoluzione screenshot di una figura e salvarlo su disco con qualcosa di simile al seguente:

winHandle = gethwnd(matlabFigHandle);
cmndstr = sprintf('%s','MiniCap.exe -save ','"',snapShotFileNamePath,'"',...
    ' -compress 9', ' -capturehwnd ', num2str(winHandle),' -exit');
system(cmndstr);

Altri suggerimenti

Il formato di file fa una grande differenza. Ecco un grafico a dispersione di esempio

n = 1e4;
hfig = figure;
hax = plot(1:n, rand(1, n), '+');

... e alcuni tempi per il salvataggio in diversi formati.

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 e wmf erano giunto prima, anche se i file TIFF sono enormi, la qualità JPEG è scadente e WMF ha problemi se non siete su una piattaforma Windows.


Per i formati raster, la risoluzione influenza anche la sincronizzazione.

tic; print(hfig, 'test600.png', '-dpng', '-r600'); toc   %4.2s
tic; print(hfig, 'test72.png', '-dpng', '-r72'); toc     %0.31s

Un'altra cosa per velocizzare la stampa è quello di rimuovere pezzi di vostra trama che non si ha bisogno. La trasparenza è computazionalmente instensive, così sono leggende. Campionamento dei dati piuttosto che tracciare tutto farà risparmiare tempo troppo.

La vostra soluzione deve essere puro Matlab? Utilizzare un toolkit piattaforma per scattare un'istantanea della finestra tenendo la GUI, e scrivere che su disco. Questo è estremamente veloce, e dal momento che sarà in un thread separato dovrebbe gestire i vostri problemi di threading.

Si dovrebbe probabilmente non catturare tutto il tempo, ma solo quando una richiesta è stata effettivamente fatto attraverso il web. Anche allora, non catturano per ogni richiesta, ma solo se l'ultimo snapshot è più vecchio di 5 secondi. Questo dovrebbe andare un lungo cammino verso aiutare le prestazioni.

Si potrebbe saveas() tua figura come file .fig (che dovrebbe essere piuttosto veloce) con l'istanza di MATLAB a fare i calcoli, quindi utilizzare un diverso esempio MATLAB (possibilmente su un computer diverso) per print al formato necessario. In questo modo si evitano ritardi per le vostre altre routine, e le distorions causati dalla stampa non capita sull'istanza "principale" MATLAB.

Si noti che print è un file .m che si può guardare in per vedere se c'è qualcosa che si può buttare fuori per il vostro caso particolare. Ad esempio, si chiama private/prepare.m che credo provoca la distorsione / posizione cambia si parla di ... forse si potrebbe giocare con questo?

Aggiorna : fa i dati sono per passare attraverso un'interfaccia web? Se la base di utenti era abbastanza piccolo, forse si potrebbe provare a farla franca con insegnando loro ad utilizzare un software di desktop remoto, come ad esempio VNC, Teamviewer o la roba Terminal Server integrato in Windows per visualizzare in remoto i loro dati?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top