◀一般トップへ
  • 3050 外部コマンド実行不具合
    • 3052 Re: 外部コマンド実行不具合
      • 3053 Re2: 外部コマンド実行不具合
      • 3054 外部コマンド実行の別の不具合
  • [3050] 外部コマンド実行不具合 しゃ 2003年07月01日 11:36

    「ツール」の「外部コマンド実行」で、「標準出力を得る」を
    チェックして実行しますが、
    アプリケーションで、Sleep()のが入ったアプリケーションの
    標準出力が得られません。

    例えば、
    for ( int i = 0 ; i < 20 ; i++ )
      printf("test %d\n", i);

    のようなアプリケーションを実行するとOKですが、
    for ( int i = 0 ; i < 20 ; i++ ){
      printf("test %d\n", i);
      Sleep(1000);
    }
    ではダメです。
    • [3052] Re: 外部コマンド実行不具合 もか 2003年07月02日 11:09

      ▼しゃさん
      >「ツール」の「外部コマンド実行」で、「標準出力を得る」を
      >チェックして実行しますが、
      >アプリケーションで、Sleep()のが入ったアプリケーションの
      >標準出力が得られません。
      >
      >例えば、
      >for ( int i = 0 ; i < 20 ; i++ )
      >  printf("test %d\n", i);
      >
      >のようなアプリケーションを実行するとOKですが、
      >for ( int i = 0 ; i < 20 ; i++ ){
      >  printf("test %d\n", i);
      >  Sleep(1000);
      >}
      >ではダメです。
      どちらの場合も、私の環境ではアプリケーションが終了されてからしっかり表示されます。
      これは、stdoutがバッファリングされているためです。
      即座に表示したい場合は、バッファリングをやめるか、下記のようにfflushすれば即座に表示されます。
      #こんな風にfflushを使っていいのか実は知らないんですけど(^_^;
      >for ( int i = 0 ; i < 20 ; i++ ){
      >  printf("test %d\n", i);
         fflush( stdout );
      >  Sleep(1000);
      >}

      以下、余談です。気にしないでください。
      Win32のハンドル側でバッファリングさせない・可変長にする方法がわからないです。知ってる方が改良してくれるとありがたいです。
      そういえば、CRLFがCRとLFに分断されて出力されます。(サクラのバグ)
      さらに、GUIアプリケーションでも非表示のまま実行はひどい。
      GUIアプリケーションの標準出力を捕まえられるから、printfを使ったデバッガとして使えるのに...
      と思って表示するようにしてみたら、即座に表示されないから、使いにくい。
      • [3053] Re2: 外部コマンド実行不具合 しゃ 2003年07月02日 17:29

        ▼ もかさん
        > どちらの場合も、私の環境ではアプリケーションが終了されてからしっかり表示されます。
        すみません。私のも終了後は表示されてます。
        i < 20 としたのは適当で実際は長い間終わらないプログラム
        を想定してようするに「リアルタイム」に表示しない。
        という意味でした。

        > GUIアプリケーションの標準出力を捕まえられるから、printfを使ったデバッガとして使えるのに...
        > と思って表示するようにしてみたら、即座に表示されないから、使いにくい。

        そういう使い方もできるんでしたね。昔のTraceWinのような。。。
        これは使えると便利ですね。
      • [3054] 外部コマンド実行の別の不具合 げんた 2003年07月02日 22:29

        ふむふむと思い試しつつソースを見てみたところ1つ問題発見.
        プロセスを呼びだした側が無限ループで出力を監視しているので,実行中にCPUを100%使い切っています.
        途中にあるWaitForSingleObjectの待ち時間を200msecくらい入れてみたらまともになりましたが.

        >GUIアプリケーションの標準出力を捕まえられるから、printfを使ったデバッガとして使えるのに...
        >と思って表示するようにしてみたら、即座に表示されないから、使いにくい。
        DebugOutputStringではだめなの?