From a3843107664f7bc49b5be60ea99337131b03234c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20V=C3=B6gele?= Date: Mon, 28 Apr 2014 13:39:50 +0200 Subject: [PATCH] Meine Implementierung des Buffers --- inf3.csproj | 1 + src/BufferManuel.cs | 56 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 src/BufferManuel.cs diff --git a/inf3.csproj b/inf3.csproj index 52bbf88..5e11a0b 100644 --- a/inf3.csproj +++ b/inf3.csproj @@ -70,6 +70,7 @@ + \ No newline at end of file diff --git a/src/BufferManuel.cs b/src/BufferManuel.cs new file mode 100644 index 0000000..45d33f3 --- /dev/null +++ b/src/BufferManuel.cs @@ -0,0 +1,56 @@ +using System.Collections.Generic; +using System.Threading; + +namespace WorldOfPeacecraft +{ + class BufferManuel + { + private Queue Lines = new Queue(); + private int MaxSize; + private AutoResetEvent QueueFullLock = new AutoResetEvent(false); + private AutoResetEvent QueueEmptyLock = new AutoResetEvent(false); + + public BufferManuel (int maxSize) + { + this.MaxSize = maxSize; + } + + public void AddLine (string line) + { + bool waitRequired = false; + lock (Lines) { + if (Lines.Count >= MaxSize) { + waitRequired = true; + QueueFullLock.Reset (); + } + } + if (waitRequired) { + QueueFullLock.WaitOne (); + } + lock (Lines) { + Lines.Enqueue (line); + QueueEmptyLock.Set(); + } + } + + public string NextLine () + { + bool waitRequired = false; + string line; + lock (Lines) { + if (Lines.Count == 0) { + waitRequired = true; + QueueEmptyLock.Reset (); + } + } + if (waitRequired) { + QueueEmptyLock.WaitOne (); + } + lock (Lines) { + line = Lines.Dequeue(); + QueueFullLock.Set (); + } + return line; + } + } +}