循環バッファクラスを作成し、2つの異なるスレッドからアクセスする必要があります。循環バッファは2次元配列を使用し、1次元は行数、もう1つは浮動小数点配列の要素(2048)を使用します。ユーザーインターフェイススレッドは、任意の時点ですべての行を配列から読み取ることができます。バックグラウンドスレッドは、この配列に挿入する必要のある2048個の浮動小数点数を取得するTCPサーバースレッドです。ここでそれでユーザーインターフェーススレッドがすべての行を取得するコード循環バッファはスレッドセーフですか?もしそうでなければ、どうすればいいのですか?
static class CircularArrayBuffer
{
static float[,] buffer;
static int columns, rows;
static int nextFree = 0;
public static void CreateBuffer(int _columns, int _rows)
{
columns = _columns;
rows = _rows;
buffer = new float[rows,columns];
nextFree = 0; //reset pointer to first free buffer
}
public static float[] GetData(int index)
{
if (index > rows)
{
throw new System.ArgumentException("Index cannot be more than rows", "index");
}
float[] rowArray = new float[columns];
Buffer.BlockCopy(buffer, (((nextFree - 1 + index) % rows) * 4 * columns), rowArray, 0, columns * 4); //takes 2 microseconds!
return rowArray;
}
public static void AddData(float[] rowArray) //number of columns must be set!
{
if (rowArray.Count() > columns)
{
throw new System.ArgumentException("Data length cannot be more than number of columns", "columns");
}
Buffer.BlockCopy(rowArray, 0, buffer, nextFree * 4 * columns, columns * 4);
nextFree = (nextFree + 1) % rows;
}
}
ある50msごとかそこら背景TCPサーバは、1行毎に50ミリ秒程度を添加することにします。ユーザーインターフェイススレッドは、実際にはOpenGLのOnRenderコールバックです。私はこのクラスの問題にぶつかりますか?もしそうなら、それを避ける方法は? ありがとう、Tom
なぜすべて静的なのですか?それは意図的なのでしょうか? – CodingYoshi
パフォーマンスの理由のみ。それが本当に必要なのか分からない。 – Tom
このコードを慎重に使用してください。あなたは質問を編集し、これをどのように使用するかのサンプルコードを追加してください。私は次に問題を指摘して指摘します。しかし、あなたの使用コードがなければ、それを伝えるのは難しいです。 – CodingYoshi