1

ここに私の状況。私はまだこれでかなり新しいです。Linux仮想ボックスでいくつかの.txtファイルを生成し、Windowsでac#winformアプリケーションを使用してデータをグラフにロードしています。約20個のファイルがあります。私が行う必要があるのは、最初のファイルをロードしてチャートに表示し、ファイルをリロードしてチャートに表示し、ファイルをリロードしてチャートに表示するなどです。私のcコードは毎回同じファイルに上書きしています新しい値との時間。したがって、グラフを見ると、WinFormsで、新しいデータセットが読み込まれるたびにデータが変換されていることがわかります。これはかなり迅速に発生するはずです。新しいデータの一部が読み込まれますが、別のプロセスで使用されているファイルに関するエラーが発生します。私はエラーについて読んでいますが、私はまだそれを修正する方法を理解していないと思います。スムーズに実行されるように、ファイルを生成しているcコードがc#チャートの読み込みコードと一致する必要があります。CIでは、ファイルを書き込み用に開くことができなかったというエラーメッセージも表示されます。

これが私がこれまでに試したことです。書き込み用にファイルを開く前に、cコードでしばらく待ってみましたが、機能しませんでした。また、エラーなしで開くまでファイルを繰り返し開こうとしましたが、機能しませんでした。私が考えることができた他の唯一の解決策は、1.txt 2.txt 3.txt ...のようなファイルを作成し、それらを連続してロードすることでした。それは私が行かなければならない方法かもしれません。しかし、私はまだ新しいので、これを開始するための最良の方法であるかどうかは実際にはわかりません。

Cコード

for(i = 0; i < FILES; i++){
    fd = fopen(path, "w+");
    if( fd == NULL ){
        printf( "Could not open file for writing. Exiting...\n");
        exit(-1);
    }
    for(j = 0; j < ROW; j++){
        fprintf(fd, "%.4f", vector[i][j]);
        fprintf(fd, "%s", "\n");
    }
    fclose(fd);
}   

C#コード

// Define the event handlers. 
private void OnChanged(object source, FileSystemEventArgs e)
{
    FinalList.Clear();
    chart4.Series[0].Points.Clear();
    loadData(FinalPath, FinalList, chart4);
 }

private void loadData(String path, List<double> list, System.Windows.Forms.DataVisualization.Charting.Chart chart)
{
    string line = null;
    double value = 0;        
    using (TextReader reader = File.OpenText(path))
    {
        line = reader.ReadLine();
        while (line != null)
        {
                value = System.Convert.ToDouble(line);
                list.Add(value);
                line = reader.ReadLine();
            }
        }

        for (int i = 0; i < ROW; i++)
        {
            chart.Series["Graph"].Points.AddXY(i + 1, list[i]);

        }
    }
4

1 に答える 1

2

(ネットワーク?)ファイルシステムを使用することは、異なるプラットフォーム間でプロセス間通信を行うには悪い方法だと思います。このまま続行すると、同期の問題が発生します。ファイルが C コードによって半分しか書き込まれていない瞬間を想像してみてください。バッファーがいっぱいであるため、Linux システムはこのファイルをディスクに同期する可能性があります。これで、Windows C# アプリケーションはファイルを読み取りますが、ファイルの半分しか取得できません。C# アプリケーションは、C プログラムが完全なファイルの書き込みをいつ完了したかを認識できないため、これは望ましくありません。

Linux と Windows の間でデータを転送するには、ソケットを使用することをお勧めします。


Linux 側では、非常に安価なソケット実装を使用できます。たとえば、データを書き込み、コマンドを netcat ( ubuntu の場合)と組み合わせてfile.txt使用​​して、ファイルを公開することができます。systemnc

cat file.txt | nc -l 1234

Windows用のnetcatもダウンロードできるようです。次のようにファイルを取得できます ( 1.2.3.4Linux VM の IP アドレスに置き換えます)。

nc 1.2.3.4 1234 > file.txt

Windows が Linux VM に到達できることを確認します。VirtualBox のデフォルトネットワーク モード(NAT) では、これは不可能ですが、簡単に変更できます。

于 2013-03-23T19:48:23.793 に答える