示例#1
0
        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));
                }
            }
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }