网上找的好多使用管道例子都不能算是实时的。必须等到控制台程序执行完毕后将管道内容输出至Memo中。我是使用THandleStream方式。但是如果控制台程序执行时间较长,而中间可能会不定期产生输出的话,那就不适合了。必须等长时间执行完毕后才能返回输出结果。有没有办法可以在控制台程序执行过程中实时输出内容?我本想将进程执行信息结构TStartupInfo的hStdOutput赋值直接给和memo显示有关的handle。但找不到这样的handle,而且如此的话也就不需要管道了。这个思路似乎不行。不知有无其他清晰及简单一点的办法。项目用在一个比较紧急但很小型的测试程序上。谢谢。

解决方案 »

  1.   

    找一下 Tdoscmd 这个控件
      

  2.   

    谢谢。怎么我装不上去。老是报告[Fatal Error] DosCommand.pas(1): Program or unit 'DosCommand.pas' recursively uses itself
    我的是Delphi 7。昨天才装的。
      

  3.   

    搞定。晕倒。package的名字不能和unit一样。
      

  4.   

    好像还是需要等到dos程序执行完才得到输出嘛。是不是我哪里漏写了?DosCommand1.CommandLine := CmdStr;
        DosCommand1.OutputLines := Memo1.Lines;
        DosCommand1.Execute;还需要设定什么吗?看它的说明和例子好像没其他的了呀。
      

  5.   

    程序的源码里特地注明了可以实时输出:this component let you execute a dos program (exe, com or batch file) and catch
    the ouput in order to put it in a memo or in a listbox, ...
      you can also send inputs.
      the cool thing of this component is that you do not need to wait the end of
    the program to get back the output. it comes line by line.我想应该还是我的问题吧。但是看来看去就那么几个属性。不用设了呀。
      

  6.   

    实时输出,是通过事件来进行的,与tcp的数据到达事件类似
      

  7.   

    你是说用那个onnewline事件吗?我试过了,好像无效呀?
      

  8.   

    可能要把OutputLines设为空才有效
      

  9.   

    OutputLines设为空那我的memo怎么捕获输出?
      

  10.   

    在onnewline事件里加到memo就行了
      

  11.   

    我刚才试了一下
    DosCommand1.OutputLines := Memo1.Lines; 注掉然后在onnewline事件里加上
    memo1.Lines.Add(NewLine);
    。。还是老样子,要等到程序执行完毕才反馈结果 :(
      

  12.   

    我的是可以的:  object DOScmd: TDosCommand
        OnNewLine = DOScmdNewLine
        OnTerminated = DOScmdTerminated
        InputToOutput = False
        MaxTimeAfterBeginning = 0
        MaxTimeAfterLastOutput = 0
        Left = 308
        Top = 116
      end
      

  13.   

    http://maxxdelphisite.free.fr/doscmd.htm
      

  14.   

    你的这个是dfm窗体单元文件内容吧?
    那DOScmdNewLine和DOScmdTerminated这两个函数是怎么填的?
    DosCommand1.OutputLines没设?
      

  15.   


    谢谢
    我问一下,如果在cmd中,打入dir c:\
    会显示c盘下面的一些文件夹和文件
    所显示的哪些文件夹和文件会不会在memo1中?
    相当于dir c:\>>c:\1.txt
    中txt中的内容一样?
      

  16.   



    可能连错误信息(stderr)也会有
      

  17.   

    是dfm的内容procedure TFormMain.DOScmdTerminated(Sender: TObject);
    begin
      bdosstop:=true;
    end;
    procedure TFormMain.DOScmdNewLine(Sender: TObject; NewLine: String;
      OutputType: TOutputType);
    begin
      FormMain.Mlog.Lines.Add('DOS|'+formatdatetime('hh:nn:ss.zzz',now)+':'+newline);
    end;没设
      

  18.   

    哦,还有一种情况,如果那个命令行程序只是printf而没有flush,可能也会导致输出不那么实时
      

  19.   

    我在盒子上下载一个源码,和楼主的需要挺像的,可里面有一个叫spawn.exe的程序,没有源码
    http://2ccc.com/article.asp?articleid=2029
    这是网址,楼主如果不嫌哪个exe的话,倒可以试试
      

  20.   

    结贴了!
    就是flush的问题。不用在事件里写,设定DosCommand1.OutputLines就成