MATLAB - 显示DOS命令的输出为静态文本 [英] matlab - display dos command output to static text

查看:599
本文介绍了MATLAB - 显示DOS命令的输出为静态文本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的GUI来调用终端命令。通过使用 DOS(my_command,'-echo')我可以在Matlab的命令窗口的命令的输出。反正是有复制的 -echo 在我的GUI一个静态文本?

i am using GUI to call a terminal command. By using dos(my_command, '-echo') i can get the command output in Matlab's Command Window. Is there anyway to replicate that -echo in a static text in my GUI?

目前,以 my_command ,我写输出到登录文件,并通过更新静态文本的字符串这个日志文件过程完成后,但我要的是一个实时观看就像在命令窗口:显示输出通过实时线线。谢谢你。

Currently, with my_command, I write the output to a log file, and update the static text's String by this log file after process finishes, but what I want is a live-view like in Command Window: output is displayed line by line in real-time. Thanks.

更新:

@Hoki:另一个问题是:正在执行控制台命令时,如果我关闭GUI,然后返回Matlab的UNSTOPABLE的错误,我怎么可以冻结整个GUI,直到命令完成

@Hoki: another question is: when the console commands are being executed, if I close the GUI then Matlab returns errors unstopable, how can I freeze the whole GUI until the commands are finished?

推荐答案

由于亚伊尔奥特曼的信息在这个的文章,我得到了一些工作,但它涉及到黑客到Matlab的Java基本对象(即命令窗口)。

Thanks to Yair Altman info in this article, I got something to work but it involves hacking into Matlab Java base objects (namely the command window).

这涉及到一个监听器连接到Matlab的命令窗口。现在要小心,经常保存您的工作,并ppared杀死Matlab的过程$ P $好几次,直到你得到它的权利......因为每次你在$ C $一个错误C,你是停留在一种无限循环(错误/警告发送到命令行窗口,这会触发监听器,从而重新触发错误等)。我不得不重新启动Matlab的时代了良好的十几只是为了让下面的例子在一个稳定的工作方式。

It involves attaching a listener to the Matlab command window. Now be careful, save your work often and be prepared to kill Matlab process quite a few times until you get it right ... because every time you have an error in the code you are stuck in a kind of infinite loop (the error/warning is sent to the command window, which triggers your listener, which re-trigger the error etc ...). I had to restart Matlab a good dozen of times just to get the example below to work in a stable way.

这也是为什么我只能暂时装上监听器的原因。只是发送 DOS 命令之前,我后直接删除监听。您可以永久离开听者或调整,为您的需求,但是从正上方记得别人的忠告。亦认为,命令窗口可以容纳字符的巨量,你可能不希望在你的文本,因此你必须管理你从它那里得到的文本(取一个子集作为例子),如果你考虑想的追加的或简单的刷新的文本在文本框中。

That's also the reason why I only attach the listener temporarily. just before sending the dos command and I remove the listener directly after. You can leave the listener permanently or adjust that to your needs but remember the advice from just above. Also consider that the command window can hold a massive amount of character, which you may not want all in your textbox, so you have to manage the text that you get from it (take a subset as in the example), and consider if you want to append or simply refresh the text in the textbox.

下面的例子似乎是稳定的,因为它是在你自己的风险任何修改; - )

The example below seems to be stable as it is, any modification at your own risks ;-)

在评论请求后我加3个功能:

After request in comment I added 3 functions:


  • 这是 onCleanup 。这是一个Matlab的功能,允许在一些情况下不得已而为之的动作出错(一种一网打尽机制)。重推荐使用的无证的功能,这样的计划。

  • An onCleanup. This is a Matlab functionality to allow last resort action in case something goes wrong (a kind of "catch all" mechanism). Heavily recommended for this kind of program using undocumented functions.

A myCloseRequestFcn 这拦截窗口的关闭行动,删除侦听,避免错误的循环。

A myCloseRequestFcn which intercept the closing action of the window to remove the listener and avoid error loops.

A scroll_to_bottom 功能。这一次允许的文本框中插入符号移动到文本的结尾(=滚动到万一有较明显的空间更多的文本底部)。

A scroll_to_bottom function. This one allows to move the text box caret to the end of the text (= to scroll to the bottom in case there is more text than visible space).

警告:最后一个功能可以值得一个单独的问题,并再次呼吁的无证的功能(所以兼容性并不保证)。为了能够实现它,你的需要有<一个href=\"http://uk.mathworks.com/matlabcentral/fileexchange/14317-findjobj-find-java-handles-of-matlab-graphic-objects/content/findjobj.m\"相对=nofollow> findjobj 在Matlab的可用路径的功能。如果你不想下载外部组件,然后删除/评论说,使用它和子功能 scroll_to_bottom code的一部分(而忘记了滚动文本框,有没有办法做,在纯Matlab的)。的或者,您可以通过查看文章的编辑历史

Warning: The last functionality could deserve a separate question and again call for undocumented functionality (so the compatibility is never guaranteed). To be able to implement it you need to have the findjobj function available in your Matlab path. If you do not want to download external component, then delete/comment the part of code that uses it and the subfunction scroll_to_bottom (and forget about scrolling the text box, there is no way to do that in pure Matlab). Or you can pick the previous version of the code by looking at the edit history of the post.

function h = gui_MirrorCmdWindow

%% // just to remove the listener in case something goes wrong
closeup = onCleanup(@() cleanup);

%% // create figure and uicontrol
h.f = figure;
h.txtOut = uicontrol(h.f,'Style','edit','Max',30,'Min',0,...
                   'HorizontalAlignment','left',...
                   'FontName','FixedWidth',...
                   'Units','Normalized',...
                   'Enable','On',...
                   'Position',[.05 .2 .9 .75]);

h.btnPing = uicontrol(h.f,'Style','Pushbutton',...
                   'String','Ping',...
                   'Units','Normalized',...
                   'Position',[.05 .05 .9 .1],...
                   'Callback',@btnPing_callback);

guidata(h.f,h)

%// intercept close request function to cleanup before close
set(gcf,'CloseRequestFcn',@myCloseRequestFcn) 

%% // Get the handle of the Matlab control window
jDesktop = com.mathworks.mde.desk.MLDesktop.getInstance;
jCmdWin = jDesktop.getClient('Command Window');
jTextArea = jCmdWin.getComponent(0).getViewport.getView;

%% // Get the handle of the jave edit box panel component
jtxtBox = findjobj(h.txtOut) ;
jTxtPane = jtxtBox.getComponent(0).getComponent(0) ;

%// Save these handles
setappdata( h.f , 'jTextArea', jTextArea ) ;
setappdata( h.f , 'jTxtPane',  jTxtPane ) ;


function btnPing_callback(hobj,~)
    h = guidata(hobj) ;
    jTextArea = getappdata( h.f , 'jTextArea' ) ;

    my_command = 'ping google.com -n 10' ;
    startPos = jTextArea.getCaretPosition ;
    set(jTextArea,'CaretUpdateCallback',{@commandWindowMirror,h.f,startPos}) ;
    dos( my_command , '-echo' ) ;
    pause(1) %// just to make sure we catch the last ECHO before we kill the callback
    set(jTextArea,'CaretUpdateCallback',[]) ;
    scroll_to_bottom(h.f)


function commandWindowMirror(~,~,hf,startPos)
    h = guidata(hf) ;
    jTextArea = getappdata( h.f , 'jTextArea' ) ;

    %// retrieve the text since the start position
    txtLength = jTextArea.getCaretPosition-startPos ;
    if txtLength > 0 %// in case a smart bugger pulled a 'clc' between calls
        cwText = char(jTextArea.getText(startPos-1,txtLength) ) ; 
    end
    %// display it in the gui textbox
    set( h.txtOut, 'String',cwText ) ; 
    scroll_to_bottom(h.f)


function scroll_to_bottom(hf)
    %// place caret at the end of the texbox (=scroll to bottom)
    jTxtPane  = getappdata( hf , 'jTxtPane' ) ;
    jTxtPane.setCaretPosition(jTxtPane.getDocument.getLength)


function myCloseRequestFcn(hobj,~)
    cleanup ;       %// make sure we remove the listener
    delete(hobj) ;  %// delete the figure


function cleanup
    jDesktop = com.mathworks.mde.desk.MLDesktop.getInstance;
    jCmdWin = jDesktop.getClient('Command Window');
    jTextArea = jCmdWin.getComponent(0).getViewport.getView;
    set(jTextArea,'CaretUpdateCallback',[]) ;

这篇关于MATLAB - 显示DOS命令的输出为静态文本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆