Meine Lösung für Aufgabenblatt 2

This commit is contained in:
2014-03-25 20:36:22 +01:00
parent 8ca53e62dd
commit b93e11e986
4 changed files with 158 additions and 0 deletions

View File

@@ -0,0 +1,91 @@
using System;
using System.Threading;
public class Terminal
{
private Object TerminalLock = new Object ();
private Object ReadLineLock = new Object ();
private AutoResetEvent ResetEvent = new AutoResetEvent(false);
private String InputBuffer = "";
private bool AcceptInput = false;
private int OutLinePos;
public Terminal ()
{
OutLinePos = Console.CursorTop;
Thread catchInputThread = new Thread(new ThreadStart(this.CatchInput));
catchInputThread.Start ();
}
private void CatchInput ()
{
while (true) {
ConsoleKeyInfo key = Console.ReadKey (false);
lock (TerminalLock) {
if (!AcceptInput)
{
Console.CursorLeft--;
Console.Write(" ");
Console.CursorLeft--;
continue;
}
if (key.Key == ConsoleKey.Backspace)
{
if (InputBuffer.Length == 0)
continue;
InputBuffer = InputBuffer.Substring(0, InputBuffer.Length - 1);
ClearInputLine ();
Console.Write (InputBuffer);
}
else if (key.Key == ConsoleKey.Enter)
{
AcceptInput = false;
ResetEvent.Set ();
OutLinePos = Console.CursorTop;
}
else
{
InputBuffer += key.KeyChar;
ClearInputLine ();
Console.Write (InputBuffer);
}
}
}
}
public void PrintLine (String s)
{
lock (TerminalLock) {
ClearInputLine();
Console.WriteLine (s);
OutLinePos = Console.CursorTop;
Console.Write (InputBuffer);
}
}
public String ReadLine ()
{
lock (ReadLineLock) {
String result;
AcceptInput = true;
ResetEvent.WaitOne();
result = InputBuffer;
InputBuffer = "";
return result;
}
}
public void ClearInputLine ()
{
lock (TerminalLock) {
int top = Console.CursorTop;
int left = Console.CursorLeft;
Console.SetCursorPosition (0, OutLinePos);
while (left != Console.CursorLeft || top != Console.CursorTop) {
Console.Write (" ");
}
Console.SetCursorPosition (0, OutLinePos);
}
}
}