Advertisement
Guest User

Untitled

a guest
Aug 31st, 2016
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
D 6.59 KB | None | 0 0
  1. //////////////////////////////Event.d/////////////////////
  2. module Event;
  3. import std.uuid;
  4. import std.datetime;
  5. import std.random;
  6.  
  7.  
  8. struct Event
  9. {
  10. private:
  11.  
  12.     string date;
  13.     string time;
  14.     int p0;
  15.     int p1;
  16.     int p2;
  17.     UUID id;
  18.  
  19. public:
  20.     @property string Time() { return time; }
  21.     @property string Date() { return date; }
  22.  
  23.     @property int P0() { return p0; }
  24.     @property void P0(int p0) { this.p0 = p0;}
  25.  
  26.     @property int P1() { return p1; }
  27.     @property void P1(int p1) { this.p1 = p1;}
  28.  
  29.     @property int P2() { return p2; }
  30.     @property void P2(int p2) { this.p2 = p2;}
  31.  
  32.     @property UUID ID() { return id;}
  33.    
  34.    
  35.  
  36. }
  37.  
  38. Event CreateEvent()
  39. {
  40.     Event event;
  41.     event.id = randomUUID();
  42.     auto currentDateTime = Clock.currTime();
  43.     event.date = (cast(std.datetime.Date)currentDateTime).toSimpleString();
  44.     event.time = (cast(std.datetime.TimeOfDay)currentDateTime).toString();
  45.     event.p0 = uniform!int();
  46.     event.p1 = uniform!int();
  47.     event.p2 = uniform!int();
  48.     return event;
  49. }
  50.  
  51. ///////////////////////////Logger.d/////////////////////
  52.  
  53. module Logger;
  54. import Event;
  55. import std.stdio;
  56. import std.conv;
  57. import std.algorithm;
  58. import std.string;
  59.  
  60. enum LoggerLevel
  61. {
  62.     One, Two, Three
  63. }
  64.  
  65. interface ILoggable
  66. {
  67.     void Write(Event event);
  68. }
  69.  
  70. class AbstractLogger : ILoggable
  71. {
  72. protected:
  73.     string fileName;
  74.     File file;
  75. private:
  76.     this(string fileName)
  77.     {
  78.         this.fileName = fileName;
  79.         file.open(fileName, "a");
  80.     }
  81. public:
  82.  
  83.     void Write(Event event)
  84.     {
  85.     }
  86.     ~this()
  87.     {
  88.         file.flush();
  89.         file.close();
  90.     }
  91. }
  92.  
  93. class LoggerOne : AbstractLogger
  94. {
  95.     override void Write(Event event)
  96.     {
  97.         file.writeln();
  98.         file.write(format("|%s |%s ", event.ID, event.Time));
  99.     }
  100. protected:
  101.     this(string filename)
  102.     {
  103.         super(filename);
  104.     }
  105.  
  106. }
  107.  
  108. class LoggerTwo : LoggerOne
  109. {
  110.     override void Write(Event event)
  111.     {
  112.         super.Write(event);
  113.         file.write(format("|%s |%s ", event.Date, event.P0));
  114.     }
  115. protected:
  116.     this(string filename)
  117.     {
  118.         super(filename);
  119.     }
  120. }
  121.  
  122. class LoggerThree : LoggerTwo
  123. {
  124.     override void Write(Event event)
  125.     {
  126.         super.Write(event);
  127.         file.write(format("|%s |%s ", event.P1, event.P2));
  128.     }
  129. protected:
  130.     this(string filename)
  131.     {
  132.         super(filename);
  133.     }
  134. }
  135.  
  136.  
  137. class LoggerFactory
  138. {
  139.     AbstractLogger[LoggerLevel] cash;
  140.     string fileName;
  141.  
  142.     AbstractLogger CreateInstance(LoggerLevel level)
  143.     {
  144.         final switch(level)
  145.         {
  146.             case LoggerLevel.One: return new LoggerOne(fileName);
  147.             case LoggerLevel.Two: return new LoggerTwo(fileName);
  148.             case LoggerLevel.Three: return new LoggerThree(fileName);
  149.         }
  150.     }
  151. public:
  152.    
  153.  
  154.  
  155.     this(string fileName)
  156.     {
  157.         this.fileName = fileName;
  158.     }
  159.  
  160.     AbstractLogger GetLogger(LoggerLevel level)
  161.     {
  162.         if(!canFind(cash.keys, level))
  163.         {
  164.             cash[level] = CreateInstance(level);
  165.             return cash[level];
  166.         }
  167.         else
  168.         {
  169.             return cash[level];
  170.         }
  171.     }
  172.    
  173. }
  174.  
  175.  
  176. ///////////////////////main.d////////////////////
  177. import Logger;
  178. import Event;
  179.  
  180. import std.stdio;
  181. import std.concurrency;
  182. import std.conv;
  183. import core.thread;
  184. import std.datetime;
  185. import std.string;
  186. import std.algorithm;
  187.  
  188.  
  189. enum Command
  190. {
  191.     Pause, Resume, Faster, Slower, Exit, LevelOne, LevelTwo, LevelThree, Stat
  192. }
  193.  
  194. class InputThread
  195. {
  196. protected:
  197.     Tid loggerThread;
  198.     Tid eventThread;
  199.     alias Func = void delegate();
  200.  
  201.     Func[string] CommandMap;
  202.  
  203.     bool stop = false;
  204.     void StopThreads()
  205.     {
  206.         stop = true;
  207.         SendMessage(Command.Exit, loggerThread);
  208.         SendMessage(Command.Exit, eventThread);
  209.     }
  210.  
  211.     Func GetCommand(string command)
  212.     {
  213.         return CommandMap.get(command, delegate() { writeln("Error Command");});
  214.     }
  215.  
  216.     void ReadCommand()
  217.     {
  218.         string command = removechars(readln(), "\n");
  219.         GetCommand(command)();
  220.     }
  221.  
  222.     static void SendMessage(Command event, Tid thread)
  223.     {
  224.         thread.send(event);
  225.     }
  226.  
  227. public:
  228.     this(Tid loggerThread, Tid eventThread)
  229.     {
  230.         this.loggerThread = loggerThread;
  231.         this.eventThread = eventThread;
  232.         CommandMap["time"] = () => writeln(cast(std.datetime.TimeOfDay)Clock.currTime());
  233.         CommandMap["date"] = () => writeln(cast(std.datetime.Date)Clock.currTime());
  234.         CommandMap["exit"] = () => StopThreads();
  235.         CommandMap["slower"] = () => SendMessage(Command.Slower, eventThread);
  236.         CommandMap["faster"] = () => SendMessage(Command.Faster, eventThread);
  237.         CommandMap["pause"] = () => SendMessage(Command.Pause, eventThread);
  238.         CommandMap["resume"] = () => SendMessage(Command.Resume, eventThread);
  239.         CommandMap["level0"] = () => SendMessage(Command.LevelOne, loggerThread);
  240.         CommandMap["level1"] = () => SendMessage(Command.LevelTwo, loggerThread);
  241.         CommandMap["level2"] = () => SendMessage(Command.LevelThree, loggerThread);
  242.         CommandMap["stat"] = () => SendMessage(Command.Stat, loggerThread);
  243.     }
  244.  
  245.     void Routine()
  246.     {
  247.         while(!stop)
  248.         {
  249.             ReadCommand();
  250.         }
  251.     }
  252.  
  253. }
  254.  
  255.  
  256.  
  257.  
  258.  
  259. class LoggerThread
  260. {
  261.  
  262. public:
  263.     static void Routine()
  264.     {
  265.         auto loggers = new LoggerFactory("log.txt");
  266.         auto loggerLevel = LoggerLevel.One;
  267.         bool stop = false;
  268.         int stat = 0;
  269.         while(!stop)
  270.         {
  271.             receive(
  272.                 (Command val)
  273.                 {
  274.                     switch(val)
  275.                     {
  276.                         case Command.Exit: stop = true; break;
  277.                         case Command.Stat: writeln(stat); break;
  278.                         case Command.LevelOne: {
  279.                             loggerLevel = LoggerLevel.One;
  280.                         } break;
  281.                         case Command.LevelTwo: {
  282.                             loggerLevel = LoggerLevel.Two;
  283.                         } break;
  284.                         case Command.LevelThree: {
  285.                             loggerLevel = LoggerLevel.Three;
  286.                         } break;
  287.                         default:
  288.                     }
  289.                 },
  290.                 (Event event)
  291.                 {
  292.                     loggers.GetLogger(loggerLevel).Write(event);
  293.                     stat++;
  294.                 }
  295.             );
  296.         }
  297.         writeln("Logger thread end");
  298.     }
  299. }
  300.  
  301. class EventThread
  302. {
  303. public:
  304.     static void Routine(Tid loggerThread)
  305.     {
  306.         bool stop = false;
  307.         bool pause = false;
  308.         int interval = 1000;
  309.         int defaultValue = interval;
  310.         while(!stop)
  311.         {
  312.             receiveTimeout(
  313.                            dur!("msecs")(interval),
  314.                            delegate (Command val) {
  315.                                switch(val)
  316.                                {
  317.                                    case Command.Exit : stop = true; break;
  318.                                    case Command.Pause : pause = true; break;
  319.                                    case Command.Faster : interval /= 10; break;
  320.                                    case Command.Slower : interval *= 10; break;
  321.                                    case Command.Resume : pause = false; break;
  322.                                    default:
  323.                                }
  324.                            }
  325.             );
  326.             if(!pause)
  327.             {
  328.                 loggerThread.send(CreateEvent());
  329.             }
  330.         }
  331.         writeln("End event thread");
  332.     }
  333. }
  334.  
  335. int main(string[] argv)
  336. {
  337.     auto loggerThreadID = spawn({ LoggerThread.Routine();});
  338.     auto eventThreadID = spawn(function(Tid loggerThreadID) { EventThread.Routine(loggerThreadID); }, loggerThreadID);
  339.     auto inputThread = new InputThread(loggerThreadID, eventThreadID);
  340.     inputThread.Routine();
  341.     readln();
  342.     return 0;
  343. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement