2016-04-22 7 views
2

極端な高速ロギング(高速カメラに関するフレーム情報)が必要です。 私はログに記録する必要がある数字と、単純なfile.logです。 これはイベントロギングが遅くなることです。マルチスレッドアプリケーションでファイルロギングを実行する方法

それで私は、ファイルストリームを作成して、アプリケーション用にファイルをロックできると思っていました。それに追加します。

通常、私は、このような方法で内部

Filestream fs = new FileStream(@"D:\Log.csv", FileMode.Append, FileAccess.Write, FileShare.ReadWrite); 

ような単純な線を使用します。

しかしカメラドライバのフレームは新しいスレッドでそれぞれ実行されるので、ここで問題が発生します。ログファイルが書き込まれるたびに、ファイルを再オープンして閉じる必要はありません。 (開閉が遅い)。

プログラムの最初にログファイルを開きたいと思います。スレッドは、書き込みを実行するだけで、何度も何度も閉じたり開いたりしないでください。そこいくつかの方法がありますが、ほとんどすべてではないが、特にマルチスレッド環境で、キューイングを伴う

using System.IO; 
FileStream fs = new FileStream(@"D:\Log.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite); 

    static void Main(string[] args) 
    { 
     // doing it in main doesn't work either. 
     fs = new FileStream(@"D:\Log.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite); 
     //... 
     //.. init camera and start camera lots of code follows but is not related to the question. 
    } 

    Camera_Thread.FrameArrived (FrameArrivedEventArgs e) 
    { 
     byte[] n = MyFilterFunction(e.frame);   
     fs.WriteByte(MyArrayToString(n)); 
    } 
+0

「うまくいきません」というのはかなり特殊です。実際の問題点を明確にしてください。 –

+0

[TextWriterTraceListener]を使用しない理由(https://msdn.microsoft.com/en-us/library/system.diagnostics.textwritertracelistener%28v=vs.110%29.aspx) – qxg

+0

@ LasseV.Karlsen、私はこのファイルを宣言するいくつかの組み合わせを試してみましたが、コンパイラは宣言しようとしましたが、fs filestream変数はcamera_thread.FrameArivedとして認識されませんでした(fs is notはグローバル変数です) – user3800527

答えて

1

:どのようにこれが機能しないため、これを達成するために

MSMQを使用して処理のためにログをキューに入れることができます。また、別のスレッドを使用してメモリ内のキューからログを処理することもできます。

string logFile = "Log.txt"; 
this.Queue = new ConcurrentQueue<string>(); 

var thread = new Thread(() => 
{ 
    string log; 

    while (true) 
    { 
     while (!this.Queue.IsEmpty) 
     { 
      if (!this.Queue.TryDequeue(out log)) continue; 

      File.AppendAllText(logFile, "\n" + log); 
     } 

     Thread.Sleep(1000); 
    } 

}); 

thread.Start(); 

この実装は、ロギングスレッドをキャンセルする方法を考慮していないので、私はあなたがあなた自身の最初にそれをしようとしてもらおう。私はまた、これは非常に信頼性の高いものではないことを付け加えます。私は実際にMSMQを使用します。

+0

の速度は本当に私が持っている問題です、私は極端に高速に記録する必要があります。 – user3800527

+0

アウトオブプロセスのキューイングは、私のI/O問題のための奇妙な解決策のようです。私はそれが問題をより大きくすると思う。 –

+0

もちろん、処理待ちのメモリに保存されているすべてのログを失う危険がありますが、アプリケーションがクラッシュした場合には、 –

関連する問題