2013-10-13 27 views
0

首先,我很初學編程,你可能會看到,但這裏是我的問題: 我想記錄一個Kinects加速度計數據,並將其寫入文件每5分鐘作爲備份。但是我無法在Timers OnTimeEvent中獲得StringBuilder數據,它包含了我從加速度計獲得的數據。所以問題是,StringBuilder數據是否可以通過ElapsedEventArghs傳遞,或者是否有其他選項可以訪問StringBuilders數據? 我在這裏複製我的代碼: 命名空間KinectSokadikTeszt {Kinect加速度計數據定時器備份

public class CounterClass 
{ 
    private int counter; 

    public int Counter 
    { 
     get { return counter; } 
     set { counter = value; } 
    } 
    private StringBuilder stringTemp; 

    public StringBuilder StringTemp 
    { 
     get { return stringTemp; } 
     set { stringTemp = value; } 
    } 
    public int GetCounter() 
    { 
     return counter; 
    } 
} 

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     CounterClass sz = new CounterClass(); 
     KinectSensor sensor = KinectSensor.KinectSensors[0]; 
     Vector4 gravity; 
     FileStream fs = new FileStream(@"c:\teszt.txt", FileMode.Create); 
     fs.Close(); 
     StreamWriter sw = new StreamWriter(@"c:\teszt.txt"); 
     sz.StringTemp = new StringBuilder(); 
     sz.Counter = 0; 
     Timer timer = new Timer(); 
     timer.Start(); 
     timer.Elapsed += new ElapsedEventHandler(OnTimeEvent); 

     timer.Interval = 300000; 
     timer.Enabled = true; 


     while (sz.Counter < 7500) 
     { 
      gravity = sensor.AccelerometerGetCurrentReading(); 
      DateTime dt = DateTime.Now; 
      Console.WriteLine("X: {0}\tY: {1}\tZ: {2}\t{3}.{4}", gravity.X, gravity.Y, gravity.Z, dt, dt.Millisecond); 
      sz.StringTemp.AppendLine("X:" + gravity.X.ToString() + "\tY:" + gravity.Y.ToString() + "\tZ:" + gravity.Z.ToString() + "\t" + dt + "." + dt.Millisecond); 
      sz.Counter++; 
     } 

    } 

    private static void OnTimeEvent(object sender, ElapsedEventArgs e) 
    { 
     sw.Write(sz.StringTemp); 
     sw.Close(); 
    } 
} 

}

回答

0

您的代碼不會有兩個工作的原因所在:

1)的StreamWriter在主宣稱,這是一個局部變量,所以事件OnTimeEvent不能看到它

2)指針CounterClass同樣的事情。

如果你想在類指針傳遞給事件中,你必須做這樣的事情:

private static void OnTimeEvent(object sender, ElapsedEventArgs e, CounterClass cz) 
{ 
    sw.Write(sz.StringTemp); 
    sw.Close(); 
} 

,並在將事件分配給定時器,你必須這樣做:

myTimer.Elapsed += new ElapsedEventHandler((sender, e) => OnTimeEvent(sender, e, cz)); 

編輯:你也可以使用這個更短的版本:

myTimer.Elapsed += (sender, e) => OnTimeEvent(sender, e, cz); 

編輯2

我見過Main(string []args),我不喜歡這麼多。我會做,如果我是你:如果設置爲true在StreamWriter的的布爾它會追加在文件的結尾串

public static void Main(string[] args) 
{ 
    CounterClass sz = new CounterClass(); 
    KinectSensor sensor = KinectSensor.KinectSensors[0]; 
    Vector4 gravity; 
    sz.StringTemp = new StringBuilder(); 
    sz.Counter = 0; 
    Timer timer = new Timer(); 
    timer.Start(); 
    timer.Elapsed += (sender,e) => OnTimeEvent(sender,e,cz); 
    timer.Interval = 300000; 
    timer.Enabled = true; 
    while (sz.Counter < 7500) 
    { 
     gravity = sensor.AccelerometerGetCurrentReading(); 
     DateTime dt = DateTime.Now; 
     Console.WriteLine("X: {0}\tY: {1}\tZ: {2}\t{3}.{4}", gravity.X, gravity.Y, gravity.Z, dt, dt.Millisecond); 
     sz.StringTemp.AppendLine("X:" + gravity.X.ToString() + "\tY:" + gravity.Y.ToString() + "\tZ:" + gravity.Z.ToString() + "\t" + dt + "." + dt.Millisecond); 
     sz.Counter++; 
    } 

} 
private static void OnTimeEvent(object sender, ElapsedEventArgs e, CounterClass cz) 
{ 
    using(System.IO.StreamWriter sw=new System.IO.StreamWriter("myPath\\MyFileName.txt",true)) 
     sw.Write(sz.StringTemp); 
} 

。如果文件不存在,布爾值將被丟棄,並且Streamwriter將創建該文件。 欲瞭解更多關於StreamWriter的信息,請看看here

+0

@DánielNagy不客氣。但請閱讀規則,因爲在本網站禁止寫「我喜歡它」「非常感謝喲」等等......祝你有個美好的一天, – Tinwor