Eigener Buffer für Producer-Consumer Lösung.

Noch unvollständig
This commit is contained in:
Daniel Herrmann
2014-04-16 14:28:01 +02:00
parent 32048c3d84
commit cc268a3983
4 changed files with 49 additions and 19 deletions

35
src/Buffer.cs Normal file
View File

@@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace WorldOfPeacecraft
{
public class Buffer
{
private Queue<string> RawBuffer = new Queue<string>();
private AutoResetEvent BufferFilledEvent = new AutoResetEvent (false);
int size;
public Buffer(int size)
{
this.size=size;
}
public void AddToBuffer (string s)
{
if (RawBuffer.Count >= size){
}
else{
lock (RawBuffer) {
RawBuffer.Enqueue (s);
BufferFilledEvent.Set ();
}
}
}
}
}

View File

@@ -23,16 +23,16 @@ namespace WorldOfPeacecraft
public const string MessPlayers = "players";
public const string MessDragon = "dragon";
public const string MessMapcell = "cell";
private Queue<string> Buffer = new Queue<string> ();
private AutoResetEvent BufferFilledEvent = new AutoResetEvent (false);
private Buffer MonsterBuffer;
private Thread ParserThread;
private LinkedList<string> Message;
private Regex LastLineRegex;
private Backend backend;
private Player DummyPlayer;
public Parser ()
public Parser (Buffer b)
{
MonsterBuffer = b;
ParserThread = new Thread (new ThreadStart (this.RunParser));
ParserThread.Start();
Message = new LinkedList<string> ();
@@ -40,11 +40,11 @@ namespace WorldOfPeacecraft
}
private void RunParser ()
{
{/*
while (true) {
bool waitRequired = false;
lock (Buffer) {
if (Buffer.Count == 0) {
lock (MonsterBuffer) {
if (MonsterBuffer.Count == 0) {
waitRequired = true;
BufferFilledEvent.Reset ();
}
@@ -58,9 +58,9 @@ namespace WorldOfPeacecraft
if (IsCompletePackage ()) {
Parse ();
}
}
}*/
}
public Player getDummyPlayer()
{
return DummyPlayer;
@@ -421,13 +421,7 @@ namespace WorldOfPeacecraft
ParserThread.Abort ();
}
public void AddToBuffer (string s)
{
lock (Buffer) {
Buffer.Enqueue (s);
BufferFilledEvent.Set ();
}
}
private class Block
{

View File

@@ -9,13 +9,13 @@ namespace WorldOfPeacecraft
{
private TcpClient Client;
private StreamReader Reader;
private Parser Parser;
private Buffer KillerBuffer;
private Thread ReceiverThread;
public Receiver (TcpClient client, Parser parser)
public Receiver (TcpClient client, Buffer buffer)
{
this.Client = client;
this.Parser = parser;
this.KillerBuffer = buffer;
ReceiverThread = new Thread(new ThreadStart(this.doReceive));
ReceiverThread.Start();
}
@@ -29,7 +29,7 @@ namespace WorldOfPeacecraft
{
this.Reader = new StreamReader (Client.GetStream ());
while (true) {
Parser.AddToBuffer(Receive());
KillerBuffer.AddToBuffer(Receive());
}
}