From: <br...@us...> - 2008-07-25 13:20:47
|
Revision: 302 http://acmcontester.svn.sourceforge.net/acmcontester/?rev=302&view=rev Author: brus07 Date: 2008-07-25 13:20:56 +0000 (Fri, 25 Jul 2008) Log Message: ----------- Checking the tester on employment. Send and receive SystemMessage from Testers. Modified Paths: -------------- ACMServer/trunk/ACMServer/Library/Connector/SocketServer.cs ACMServer/trunk/ACMServer/Plugins/MediatorPlugins/SocketServerGatePlugin/SocketServerGate.cs ACMServer/trunk/ACMServer/Tester/Form1.cs Modified: ACMServer/trunk/ACMServer/Library/Connector/SocketServer.cs =================================================================== --- ACMServer/trunk/ACMServer/Library/Connector/SocketServer.cs 2008-07-25 10:00:45 UTC (rev 301) +++ ACMServer/trunk/ACMServer/Library/Connector/SocketServer.cs 2008-07-25 13:20:56 UTC (rev 302) @@ -1,5 +1,6 @@ using System; using JadBenAutho.EasySocket; +using System.Collections.Generic; namespace AcmContester.Library.Connector { @@ -33,27 +34,121 @@ } } + public void Send(string message) + { + List<int> freeTesters = GetFreeTesters(); + if (freeTesters.Count != 0) + { + Random random = new Random(); + DataSender(message, freeTesters[random.Next() % freeTesters.Count]); + } + } + protected virtual void DataSender(string message, int clientIndex) + { + server.SendData(message, clientIndex); + } + private void DataArrived(object Data, SocketStream DataSender) { - OnDataArrived(Data.ToString()); + if (SystemMessage(Data.ToString()) == true) + return; + DataArriver(Data.ToString()); } - - public void Send(string message) + protected virtual void DataArriver(string message) { - server.SendData(message, 0); + OnDataArrived(message); } + private void OnDataArrived(string message) + { + if (onDataArrived != null) + { + onDataArrived(message); + } + } public int CountClients() { return server.CountClients; } - private void OnDataArrived(string message) + + Queue<string> q = new Queue<string>(); + + /// <summary> + /// \xCF\xEE\xE2\xE5\xF0\xF2\xE0\xBA \xF1\xEF\xE8\xF1\xEE\xEA \xE2\xB3\xEB\xFC\xED\xE8\xF5 \xF2\xE5\xF1\xF2\xE5\xF0\xB3\xE2. + /// ³\xE4\xEF\xF0\xE0\xE2\xEB\xFF\xBA \xEA\xEE\xE6\xED\xEE\xEC\xF3 \xF2\xE5\xF1\xF2\xE5\xF0\xF3 \xEF\xEE\xE2\xB3\xE4\xEE\xEC\xEB\xE5\xED\xED\xFF \xE2\xE8\xE3\xEB\xFF\xE4\xF3: + /// test HashCodeTester HashCode\xC7\xE0\xEF\xE8\xF2\xF3 + /// \xC4\xE5 HashCode\xC7\xE0\xEF\xE8\xF2\xF3 - \xF6\xE5 \xF3\xED\xB3\xEA\xE0\xEB\xFC\xED\xE8\xE9 \xF5\xE5\xF8 \xEA\xEE\xE4 \xEA\xEE\xE6\xED\xEE\xE3\xEE \xF2\xE0\xEA\xEE\xE3\xEE \xE7\xE0\xEF\xE8\xF2\xF3. + /// \xCF\xEE\xF2\xB3\xEC \xF7\xE5\xEA\xE0\xBA \xEE\xE4\xED\xF3 (1) \xF1\xE5\xEA\xED\xE4\xF3 \xEA\xEE\xEB\xE8 \xE7\xE0\xEF\xEE\xE2\xED\xE8\xF2\xFC\xF1\xFF q \xF1\xEF\xE8\xF1\xEA\xEE\xEC \xEF\xF0\xE8\xF1\xEB\xE0\xED\xE8\xF5 \xEF\xEE\xE2\xB3\xE4\xEE\xEC\xEB\xE5\xED\xFC + /// \xDF\xEA\xF9\xEE \xF2\xE5\xF1\xF2\xE5\xF0 \xEF\xEE\xE2\xB3\xE4\xEE\xEC\xEB\xFF\xBA \xF9\xEE \xE2\xB3\xED \xE2\xB3\xEB\xFC\xED\xE8\xE9, \xF2\xEE\xE4\xB3 \xE9\xEE\xE3\xEE \xED\xEE\xEC\xE5\xF0 \xE7\xE0\xED\xEE\xF1\xE8\xF2\xFC\xF1\xFF \xE4\xEE \xF0\xE5\xE7\xF3\xEB\xFC\xF2\xE0\xF2\xF3. + /// </summary> + /// <returns>\xD1\xEF\xE8\xF1\xEE\xEA \xE2\xB3\xEB\xFC\xED\xE8\xF5 \xF2\xE5\xF1\xF2\xE5\xF0\xB3\xE2</returns> + private List<int> GetFreeTesters() { - if (onDataArrived != null) + q.Clear(); + string curHashCode = DateTime.Now.GetHashCode().ToString(); + for (int i = 0; i < server.CountClients; i++) { - onDataArrived(message); + string message = "test"; + message += " " + server.ClientsList[i].GetHashCode().ToString(); + message += " " + curHashCode; + server.SendData(message, i); + } + + DateTime start = DateTime.Now; + Dictionary<string, int> preResult = new Dictionary<string, int>(); + while (preResult.Count < server.CountClients) + { + if (((TimeSpan)(DateTime.Now - start)).TotalSeconds > 1.0) + { + break; + } + lock (q) + { + while (q.Count != 0) + { + string curStr = q.Dequeue(); + char[] chars = new char[1]; + chars[0] = ' '; + string[] mes = curStr.Split(chars); + if (mes[0] == "free" && curHashCode == mes[2]) + { + preResult.Add(mes[1], 0); + } + } + } + System.Threading.Thread.Sleep(50); + } + + List<int> result = new List<int>(); + for (int i = 0; i < server.CountClients; i++) + { + string hashCode = server.ClientsList[i].GetHashCode().ToString(); + if (preResult.ContainsKey(hashCode) == true) + result.Add(i); + } + return result; } + + /// <summary> + /// \xCF\xE5\xF0\xE5\xE2\xB3\xF0\xE0\xBA \xF7\xE8 \xF6\xE5 \xF1\xEB\xF3\xE6\xE1\xEE\xE2\xE5 \xEF\xEE\xE2\xB3\xE4\xEE\xEC\xEB\xE5\xED\xED\xFF. + /// \xDF\xEA\xF9\xEE \xF1\xEB\xF3\xE6\xE1\xEE\xE2\xE5, \xF2\xEE\xE4\xB3 \xE2\xEE\xED\xEE \xE7\xE0\xED\xEE\xF1\xE8\xF2\xFC\xF1\xFF \xE4\xEE \xF1\xEF\xE8\xF1\xEA\xF3 q + /// </summary> + /// <param name="message">\xCF\xEE\xE2\xB3\xE4\xEE\xEC\xEB\xE5\xED\xED\xFF</param> + /// <returns>\xDF\xEA\xF9\xEE \xF6\xE5 \xF1\xEB\xF3\xE6\xE1\xEE\xE2\xE5 \xEF\xEE\xE2\xB3\xE4\xEE\xEC\xEB\xE5\xED\xED\xFF, \xF2\xEE\xE4\xE2\xB3 \xEF\xEE\xE2\xE5\xF0\xF2\xE0\xBA\xF2\xFC\xF1\xFF true \xEF\xEE \xB3\xED\xE0\xEA\xF8\xEE\xEC\xF3 false</returns> + private bool SystemMessage(string message) + { + char[] chars = new char[1]; + chars[0] = ' '; + string[] mes = message.Split(chars); + if (mes[0] == "busy" || mes[0] == "free") + { + lock(q) + q.Enqueue(message); + return true; + } + return false; + } } } Modified: ACMServer/trunk/ACMServer/Plugins/MediatorPlugins/SocketServerGatePlugin/SocketServerGate.cs =================================================================== --- ACMServer/trunk/ACMServer/Plugins/MediatorPlugins/SocketServerGatePlugin/SocketServerGate.cs 2008-07-25 10:00:45 UTC (rev 301) +++ ACMServer/trunk/ACMServer/Plugins/MediatorPlugins/SocketServerGatePlugin/SocketServerGate.cs 2008-07-25 13:20:56 UTC (rev 302) @@ -21,33 +21,55 @@ base.Start(); base.onDataArrived += DataArrived; } - public static SocketServerGate GetInstance() { return instance; } + protected override void DataSender(string message, int clientIndex) + { + Submit submit = Submit.CreateFromXml(message); + if (dataContainer.Add(submit) == true) + { + OnLogMessage("send " + submit.id + " to " + clientIndex); + base.DataSender(message, clientIndex); + } + } public new void Send(string message) { SubmitList submitList = SubmitList.CreateFromXml(message); - for (int index = 0; index < submitList.Items.Length; index++) - { - if (dataContainer.Add(submitList.Items[index]) == true) - { - base.Send(submitList.Items[index].ToString()); - } - } - OnLogMessage("SocketServerGate::Send(message)"); + OnLogMessage("Get submits"); string ids = ""; for (int i = 0; i < submitList.Items.Length; i++) { ids += " " + submitList.Items[i].id.ToString(); } OnLogMessage("\t ID: " + ids); + + for (int index = 0; index < submitList.Items.Length; index++) + { + base.Send(submitList.Items[index].ToString()); + } } + protected override void DataArriver(string message) + { + Result result = Result.CreateFromXml(message); + dataContainer.Return(result); + OnLogMessage("result " + result.Submit.id); + OnLogMessage("\t " + result.res); + + base.DataArriver(message); + } + private void DataArrived(string message) + { + if (onDataArrived != null) + onDataArrived(message); + } + + public class LogMessageEventArgs : EventArgs { public string message; @@ -56,7 +78,6 @@ message = mes; } } - public event EventHandler<LogMessageEventArgs> LogMessage; private void OnLogMessage(string p) { @@ -64,18 +85,5 @@ if (temp != null) temp(this, new LogMessageEventArgs(p)); } - - - protected void DataArrived(string message) - { - Result result = Result.CreateFromXml(message); - dataContainer.Return(result); - if (onDataArrived != null) - onDataArrived(result.ToStringX()); - - - OnLogMessage("SocketServerGate::DataArrived(message)"); - OnLogMessage("\t " + result.res + " for " + result.Submit.id.ToString()); - } } } Modified: ACMServer/trunk/ACMServer/Tester/Form1.cs =================================================================== --- ACMServer/trunk/ACMServer/Tester/Form1.cs 2008-07-25 10:00:45 UTC (rev 301) +++ ACMServer/trunk/ACMServer/Tester/Form1.cs 2008-07-25 13:20:56 UTC (rev 302) @@ -58,22 +58,59 @@ private void DataArrived(string message) { UpdateTextLog("\r\n" + message); + if (SystemMessage(message) == true) + return; AddWork(message); } + bool SystemMessage(string message) + { + char[] chars = new char[1]; + chars[0] = ' '; + string[] mes = message.Split(chars); + if (mes[0] == "test") + { + string result = ""; + if (IsBusy() == true) + { + result = "busy"; + } + else + { + result = "free"; + } + string addStr = ""; + for (int i = 1; i < mes.Length; i++) + { + result += " " + mes[i]; + } + socket.Send(result); + return true; + } + return false; + } + static string source; static object working = 0; Thread thread = new Thread(new ThreadStart(Go)); - void AddWork(string message) + bool IsBusy() { lock (working) { if ((int)working == 1 || (thread.ThreadState == ThreadState.Running)) { - UpdateTextLog("\r\n--------- busy ---------"); - return; + return true; ; } } + return false; + } + void AddWork(string message) + { + if (IsBusy() == true) + { + UpdateTextLog("\r\n--------- busy ---------"); + return; + } source = message; onDataArrived += UpdateTextLog; thread = new Thread(new ThreadStart(Go)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |