2016-05-04 58 views
1

私はWindows 10アプリケーションのファイルからC++でデータを読み込もうとしていました。しかし、私は非同期タスクを正しく構造化することに多大な努力を払っており、データを読み取るための引数の型が間違っているというエラーを連続的に受け取っています。私はGetFileAsyncとGetFileFromPathAsyncを使ってStorageFileを取得しようとしていましたが、ReadTextAsync(ファイル)はコンパイルされません。Visual C++でファイルを非同期で読み取る方法は?

auto file = Windows::Storage::StorageFile::GetFileFromPathAsync("C:\\data.txt"); 
     concurrency::create_task(Windows::Storage::FileIO::ReadTextAsync(file)).then([this, file](concurrency::task<Platform::String^> task) 
      { 
       try 
       { 
        Platform::String^ fileContent = task.get(); 
       } 
      }); 

与えられたエラーは「ファイル」のReadTextAsyncの正しいタイプではありませんということです。

は、ここで私が書いたコードの該当部分です。 IStorageFileを取り込むことになっていますが、上記の方法でファイルを構築するときに、IAsyncOperation型を受け取ります。

これは正しく機能していないという理由で、私はタスクにパスコレクションを含めなかったというアドバイスを受けましたが、データを取得するためにタスクを連鎖させることに問題がありました。私は何か根本的なものが欠けていると確信していますが、データを正しく読み込む方法についての指針は非常に高く評価されます。

答えて

3

これは、Windows::Storage::StorageFile::GetFileFromPathAsyncが最初に実行する必要がある非同期操作を返し、IStorageFile^を返すためです。これは、(私はそれをコンパイルしていない)、以下のようになります。

auto getFileAsync = Windows::Storage::StorageFile::GetFileFromPathAsync("C:\\data.txt"); 
create_task(getFileAsync).then([this](StorageFile^ sf){ 
    create_task(FileIO::ReadTextAsync(sf)).then([this](Platform::String^ text){ 
     // here use text 
    }); 
}); 
+0

まあ、それは非同期です - あなたはあなたが 'に.get()を呼び出す必要があり、その後すぐに実行したい場合は、'タスクにCREATE_TASKで返されます。あなたはGUIスレッド上でそれをしてはならないので注意してください。私は私の答えにマイナーコードの変更を加えました。 – marcinj

+0

ありがとうございました!私は最終的に正しい情報の読み込みを見ることができます。しかし、私はこのテキストを私のプログラムにローカルに保存しようとしていますので、後でそれをアルゴリズムに渡すことができます。このタスクの外部にある変数を 'text'に設定しようとすると、 「キャプチャリストに含まれていない限り、囲み関数ローカル変数をラムダ本体で参照できません」というエラーが発生します。 タスクの完了後にこれらの値を使用する方法はありますか? – hnobuhisa

+0

@hnobuhisaキャプチャリストのローカル変数、つまり[&mylocalvar]をキャプチャする必要がありますが、ファイルの読み込みタスクを非同期に実行する場合は、ローカル変数をキャプチャしてはいけませんが、この変数を囲むクラスに移動してください。キャプチャリストの詳細については、http://en.cppreference.com/w/cpp/language/lambdaを参照してください。 – marcinj

関連する問題