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 方面,您可以使用非常便宜的套接字实现。您可以将数据写入 eg,file.txt并使用该system命令与 netcat (nc在 ubuntu 上)一起发布文件。

cat file.txt | nc -l 1234

我好像你也可以下载 Windows 的 netcat。您可以像这样获取您的文件(替换1.2.3.4为您的 Linux VM 的 IP 地址):

nc 1.2.3.4 1234 > file.txt

确保您的 Windows 可以访问 Linux VM。使用 VirtualBox 默认网络模式(NAT),这是不可能的,但您可以轻松更改它。

于 2013-03-23T19:48:23.793 回答