private void CreateRing() { while (!stop) { int red = 0; int green = 0; int blue = 0; Ball[] res = new Ball[3]; res = d.GetRes(); for (int i = 0; i < 3; i++) { red += res[i].BgColor.R; green += res[i].BgColor.G; blue += res[i].BgColor.B; } var resClr = Color.FromArgb(red / 3, green / 3, blue / 3); Ring r = new Ring(a.R, resClr); Monitor.Enter(a.rings); a.rings.Add(r); r.Start(); Monitor.Exit(a.rings); Monitor.Enter(a.balls); foreach (var i in res) { i.Abort(); } Monitor.Exit(a.balls); } }
public double[,] Tree1(Value value1) { int core_num; if (value1.MT == true) { core_num = System.Environment.ProcessorCount; } else { core_num = 1; } int task_num; if (value1.Trials % core_num == 0) { task_num = value1.Trials / core_num; } else { task_num = value1.Trials / core_num + 1; } double[,] tree = new double[task_num * core_num, value1.N + 1]; double part1 = (value1.R - value1.Sigma * value1.Sigma / 2) * value1.T / value1.N; double part2 = value1.Sigma * Math.Sqrt(value1.T / value1.N); Action <object> Mthread = (mthread) => { int tasks = Convert.ToInt32(mthread) + task_num; for (int i = Convert.ToInt32(mthread); i < tasks; i++) { tree[i, 0] = value1.S; for (int j = 0; j < value1.N; j++) { tree[i, j + 1] = tree[i, j] * Math.Exp(part1 + part2 * value1.Rn[i, j]); } } }; int each_num = 0; List <Thread> thread = new List <Thread>(); for (int i = 0; i < core_num; i++) { Thread new_thread = new Thread(new ParameterizedThreadStart(Mthread)); thread.Add(new_thread); new_thread.Start(each_num); each_num = each_num + task_num; } foreach (Thread i in thread) { i.Join(); } foreach (Thread i in thread) { i.Abort(); } return(tree); }
//Create array public double[,] Rand(int Trials, int N, bool MT) { int core_num; if (MT == true) { core_num = System.Environment.ProcessorCount; } else { core_num = 1; } int task_num; if (Trials % core_num == 0) { task_num = Trials / core_num; } else { task_num = Trials / core_num + 1; } double[,] Rn = new double[task_num * core_num, N]; Action <object> Mthread = (mthread) => { int tasks = Convert.ToInt32(mthread) + task_num; Random rnd = new Random(); for (int i = Convert.ToInt32(mthread); i < tasks; i++) { for (int j = 0; j < N; j++) { Rn[i, j] = Polar(rnd); } } }; int each_num = 0; List <Thread> thread = new List <Thread>(); for (int i = 0; i < core_num; i++) { Thread new_thread = new Thread(new ParameterizedThreadStart(Mthread)); thread.Add(new_thread); new_thread.Start(each_num); each_num = each_num + task_num; } foreach (Thread i in thread) { i.Join(); } foreach (Thread i in thread) { i.Abort(); } return(Rn); }
public double[,] RNMT() { double[,] result = new double[Sims, Steps]; int cores_num = System.Environment.ProcessorCount; int each_task = Sims / cores_num; //multithreading Action <object> Multi = (multi) => { int tasks = Convert.ToInt32(multi) + each_task; Random rnd1 = new Random(GetRandomSeed()); Random rnd2 = new Random(GetRandomSeed()); for (int i = Convert.ToInt32(multi); i < tasks; i++) { for (int j = 0; j < Steps; j++) { //randn1 and randn2 are 2 uniform random values //they between 0 and 1 double randn1, randn2; double w; //repeat until w > 1 do { randn1 = 2 * rnd1.NextDouble() - 1; randn2 = 2 * rnd2.NextDouble() - 1; w = randn1 * randn1 + randn2 * randn2; } while (w > 1); //use the equations to calculate z1 and z2 double c = Math.Sqrt(-2 * Math.Log(w) / w); result[i, j] = c * randn1; } } }; int iter = 0; List <Thread> thread = new List <Thread>(); for (int i = 0; i < cores_num; i++) { Thread new_thread = new Thread(new ParameterizedThreadStart(Multi)); thread.Add(new_thread); new_thread.Start(iter); iter = iter + each_task; } foreach (Thread i in thread) { i.Join(); } foreach (Thread i in thread) { i.Abort(); } return(result); }