public static void worker(user_st user) { user_st save = work(user); lock (writer) { foreach (history_st x in save.history) { writer.Add(save.name + ", " + x.jumpnum + ", " + x.radius + "," + x.query + ", " + x.resultnum.ToString() + ", " + x.time.TotalMilliseconds + (!x.error_bool ? "" : ", " + x.error_string)); } } }
static void Main() { //init Random r = new Random((int)DateTime.Today.Ticks); List <Thread> group = new List <Thread>(); DateTime displaytime = DateTime.Now; writer.Add("User, Jump Number, Radius, Query, Result Number, Delay"); for (int i = 0; i != usernum; i++) { user_st user = new user_st(); user.name = names[r.Next(0, names.Length)] + i.ToString(); user.jumprange = r.Next(17, 56); user.next_query_time = DateTime.Now.AddSeconds(r.Next(10, 30)) - DateTime.Now; user.lastjump = DateTime.Now; user.x = r.Next(-2000, 2001); user.y = r.Next(-2000, 2001); if (r.Next(0, 3) > 1) //coin flip { user.z = r.Next(23000, 28001); //core } else { user.z = r.Next(-2000, 2000);//bubble } user.query = 2; user.jumpnum = 0; user.history = new List <history_st>(); group.Add(new Thread(() => worker(user))); } int numofactivethreads = usernum; foreach (Thread x in group) { x.Start(); } while (numofactivethreads != 0) { TimeSpan t = DateTime.Now - displaytime; if (!jumptoggle) { t = displaytime.AddMinutes(totalminutes) - DateTime.Now; } Console.Clear(); Console.WriteLine("Simulation running, " + (jumptoggle ? string.Format("{0:D2}:{1:D2}:{2:D2}", t.Hours, t.Minutes, t.Seconds) + " Elapsed." : t.Seconds > -1 ? string.Format("{0:D2}:{1:D2}:{2:D2}", t.Hours, t.Minutes, t.Seconds) + " Remaining." : string.Format("{0:D2}:{1:D2}:{2:D2}", t.Hours, t.Minutes, Math.Abs(t.Seconds)) + " Elapsed. Waiting for users to return.")); Console.WriteLine(numofactivethreads + " users remaining."); numofactivethreads = 0; foreach (Thread x in group) { if (x.IsAlive) { numofactivethreads++; } } Thread.Sleep(DateTime.Now.Millisecond > 50?1000 - DateTime.Now.Millisecond:50); } if (!Directory.Exists("worker")) { Directory.CreateDirectory("worker"); } File.WriteAllLines("worker\\work.csv", writer); }
public static user_st work(user_st user) { Random r = new Random(user.jumprange + (int)user.lastjump.Ticks); DateTime timetogglestart = DateTime.Now; while (jumptoggle?user.jumpnum != maxjumpnum:timetogglestart.AddMinutes(totalminutes) > DateTime.Now) { if (user.lastjump.Add(user.next_query_time) < DateTime.Now) { //Adjust position if (r.Next(0, 3) > 1) { user.x = user.x + user.jumprange; } else { user.x = user.x - user.jumprange; } if (r.Next(0, 3) > 1) { user.z = user.z + user.jumprange; } else { user.z = user.z - user.jumprange; } user.lastjump = DateTime.Now; //create location for mathmatics star_st curr = new star_st(); curr.coord.x = user.x; curr.coord.y = user.y; curr.coord.z = user.z; //query history_st next = new history_st(); next.radius = queryRadius[user.query]; DateTime start = DateTime.Now; next.query = "SELECT * FROM systems WHERE " + "systems.x BETWEEN " + (user.x - queryRadius[user.query]) + " AND " + (user.x + queryRadius[user.query]) + " AND " + "systems.y BETWEEN " + (user.y - queryRadius[user.query]) + " AND " + (user.y + queryRadius[user.query]) + " AND " + "systems.z BETWEEN " + (user.z - queryRadius[user.query]) + " AND " + (user.z + queryRadius[user.query] + " AND deleted_at is NULL;"); try { NpgsqlConnection conn = new NpgsqlConnection("Pooling=false; SERVER=cyberlord.de; Port=5432; Database=edmc_rse_db; User ID=edmc_rse_user; Password=asdfplkjiouw3875948zksmdxnf;Timeout=12;Application Name=stresstest-" + user.name); conn.Open(); NpgsqlTransaction tran = conn.BeginTransaction(); NpgsqlCommand command = new NpgsqlCommand(next.query, conn); NpgsqlDataReader read = command.ExecuteReader(); while (read.Read()) { check_st ret = new check_st(); ret.star.name = read["name"].ToString(); ret.star.coord.x = Double.Parse(read["x"].ToString(), CultureInfo.InvariantCulture); ret.star.coord.y = Double.Parse(read["y"].ToString(), CultureInfo.InvariantCulture); ret.star.coord.z = Double.Parse(read["z"].ToString(), CultureInfo.InvariantCulture); ret.dist = ret.star.distance(curr); next.resultnum++; } //cleanup, prep next jump conn.Close(); next.error_bool = false; } catch (Exception e) { next.resultnum = -1; next.error_bool = true; next.error_string = e.Message; } next.time = DateTime.Now - start; next.jumpnum = user.jumpnum; user.history.Add(next); if (user.history[user.jumpnum].resultnum < 15 && user.query < 10) { user.query++; } else if (user.history[user.jumpnum].resultnum > 100 && user.query > 0) { user.query--; } user.jumpnum++; } else { Thread.Sleep(((user.lastjump.Add(user.next_query_time) - DateTime.Now).TotalSeconds > new TimeSpan(0, 0, 2).TotalSeconds ? (user.lastjump.Add(user.next_query_time) - DateTime.Now) : new TimeSpan(1))); } } return(user); }