2013-03-23 118 views
1

這裏是我的情況。我在這方面還很新。我在我的linux虛擬框中生成一些.txt文件,並在Windows中使用c#winform應用程序將數據加載到圖表中。大約有20個左右的文件。我需要做的是加載第一個文件,將其顯示在圖表上,重新加載文件並將其顯示在圖表上,重新加載文件並將其顯示在圖表等上。我的c代碼每隔一段時間就在同一個文件上進行編寫時間與新的價值。所以在winforms中查看圖表時,您會看到數據在每個新數據集加載時都會轉換。這應該相當快地發生。一些新的數據加載,但然後我得到有關另一個進程正在使用的文件的錯誤。我一直在閱讀有關錯誤,但我想我仍然不明白如何解決這個問題。我需要生成文件的c代碼與c#圖表加載代碼保持一致,以便順利進行。在C中,我也收到一條錯誤消息,指出該文件無法打開進行寫入。FileSystemWatcher無法訪問文件,因爲它被另一個進程使用

這是我到目前爲止嘗試過的。在打開文件以進行寫入之前,我嘗試在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]); 

     } 
    } 
+0

你能從C程序中訪問Windows API函數嗎?如果是這樣,您可以使用CreateEvent()創建同步事件,並使用ManualResetEvent從C#程序訪問同一事件。然後你可以在程序之間做適當的同步。 – 2013-03-23 19:35:26

+0

不,先生。我與linux卡住 – 2013-03-23 19:37:39

回答

2

我猜使用(網絡?)文件系統是一個糟糕的方式做不同的平臺之間的進程間通信。如果你繼續這樣,你將會遇到同步問題。想象一下當時的文件只有C代碼的一半。由於緩衝區已滿,Linux系統可能會將此文件同步到磁盤。現在你的Windows C#應用程序讀取文件,但只會得到它的一半。這不是你想要的,因爲你的C#應用​​程序永遠不會知道C程序何時完成寫入完整的文件。

我建議你使用套接字在Linux和Windows之間傳輸數據。


在Linux中,你可以,你可以使用一個非常非常便宜套接字實現。您可以將數據寫入例如file.txt,並使用system命令與netcat(在Ubuntu上的nc)一起發佈該文件。

cat file.txt | nc -l 1234 

我好像也可以下載netcat for windows。您可以獲取您的文件中像這樣(與你的Linux虛擬機的IP地址替換1.2.3.4):

nc 1.2.3.4 1234 > file.txt 

確保Windows能夠達到的Linux VM。使用VirtualBox默認的network mode(NAT),這是不可能的,但您可以輕鬆更改它。

+0

感謝您的建議。我要研究這個。我現在正在做實習,但沒有人和我一起工作是計算機科學專業,所以我不能真正問任何問題。這絕對不是我們在任何課程中所談論的東西,但感謝上帝的互動。 – 2013-03-24 04:05:50

+0

如果你打算繼續在這個領域,確保你瞭解[socket](http://www.thegeekstuff.com/2011/12/c-socket-programming/)。這種廉價的netcat解決方案並不是很好,但有一些起點。 'nc stackoverflow.com 80';) – corny 2013-03-24 11:56:24

相關問題