|
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.
|