3

新しい行に移動しないように、Dart の多くの場所で stdout.write() を使用しています。問題なく動作していましたが、最近同期から非同期に変更されました。Win7-32​​ および Win8-64 で Dart 28355 にアップグレードしました。

変更内容は次のとおりです。

「変更点は? stdout と stderr への書き込みは、すべてのプラットフォームでブロックされていました。クリーンアップの一環として、これは dart:io の他のストリームと同様に非同期/非ブロックになりました。コードを更新するにはどうすればよいですか? ほとんどのコード「exit」を呼び出すときのいくつかのケースを除いて、以前と同じように機能するはずです:"

私が達成したいことの小さな例は次のとおりです。

import 'dart:io';

main() {
  String sCorrectYn;
  while (sCorrectYn != "y") {
    String sName = fInputString("Enter Name : ");     
    sCorrectYn = fInputString("Details Correct? (y/n) : ");
  }
}

String fInputString(String sPrompt) {
  stdout.write("\n$sPrompt");
  return stdin.readLineSync().toLowerCase();
}

上記をwin8で実行したときの端末出力は次のとおりです。

c:\Users\boh\dart-dev1\testpg001>dart testinput001.dart

Enter Name : abcd
n
xxxx
n
zzzz
y

Details Correct? (y/n) :
Enter Name :
Details Correct? (y/n) :
Enter Name :
Details Correct? (y/n) :
c:\Users\boh\dart-dev1\testpg001>

上記で発生するのは、最終的に「y」を入力した後にすべての端末出力が表示されることです。これにより、プログラムが終了し、出力バッファーがフラッシュされます (表示されます)。最初の端末出力 "Enter Name : " は、発生すべきときに発生する唯一の出力です。

stdout には「フラッシュ」メソッドがないようです。

フューチャを使用して stdout を使用して実験しましたが、正しく機能させることができませんでした。

これを必要な方法で機能させるにはどうすればよいですか?

以下も、 stdout.write() を使用して必要に応じて機能しませんでした。

import 'dart:io';

main() {
  String sInput;
  stdout.write("\nEntry 1 : ");
  sInput = stdin.readLineSync();
  print("Date Entered (1) was : $sInput");  
  stdout.write("\nEntry 2 : ");  
  sInput = stdin.readLineSync();
  print("Date Entered (2) was : $sInput");  
  stdout.write("\nEntry 3 : ");
  sInput = stdin.readLineSync();
  print("Date Entered (3) was : $sInput");  
  stdout.write("\nEntry 4 : ");
  sInput = stdin.readLineSync();
  print("Date Entered (4) was : $sInput");   
  stdout.write("\nEntry 5 : ");
  sInput = stdin.readLineSync();
  print("Date Entered (5) was : $sInput");   
}

上記の端末表示は、最初の行を示しています "Entry 1 : " は、 stdout.write() を使用するときに必要な場合にのみ表示される行です。

c:\Users\boh\dart-dev1\testpg001>dart testinput003.dart

Entry 1 : aaa
Date Entered (1) was : aaa
bbb
Date Entered (2) was : bbb
ccc
Date Entered (3) was : ccc
ddd
Date Entered (4) was : ddd
eee
Date Entered (5) was : eee

Entry 2 :
Entry 3 :
Entry 4 :
Entry 5 :
c:\Users\boh\dart-dev1\testpg001>
4

1 に答える 1

1

a を「フラッシュ」する機能は、 a を使用して待機できる新しい を作成するIOSinkことで実装できます。ヘルパー メソッドを使用して、上記の例を書き直しました。StreamControllerStreamwriteAndFlush

import 'dart:async';
import 'dart:convert';
import 'dart:io';

main() {
  void loop() {
    fInputString("Enter Name : ")
      .then((_) => fInputString("Details Correct? (y/n) : "))
      .then((sCorrectYn) {
        if (sCorrectYn != "y") loop();
      });
  }
  loop();
}

Future<String> fInputString(String sPrompt) {
  return writeAndFlush(stdout, "\n$sPrompt")
    .then((_) {
      return stdin.readLineSync().toLowerCase();
    });
}

Future writeAndFlush(IOSink sink, object) {
  return sink.addStream(
    (new StreamController()
      ..add(UTF8.encode(object.toString()))
      ..close())
      .stream);
}

flushまさにこれを行う IOSink にa を追加することは、考慮すべきオプションです。

これは実際には IO レベルでの「フラッシュ」ではありませんが、 のStream読み取りが終了するまで待機しStreamます。つまり、OS によって一時停止および再開される可能性があるのを待機します。

于 2013-10-20T15:48:58.627 に答える