public static void log(ThreadArgs args) // Запись в файл. { StreamWriter writer = new StreamWriter("times.txt"); // writer.WriteLine("TIMES:\n"); // writer.WriteLine("TIMES:\n"); for (int i = 0; i < args.t1.Count; i++) { writer.WriteLine("Time 1 (elem index: {0} ): {1}", i + 1, args.t1[i]); writer.WriteLine("Time 2 (elem index: {0} ): {1}", i + 1, args.t2[i]); writer.WriteLine("Time 3 (elem index: {0} ): {1}", i + 1, args.t3[i]); writer.WriteLine("Time 4 (elem index: {0} ): {1}", i + 1, args.t4[i]); writer.WriteLine("Time 5 (elem index: {0} ): {1}", i + 1, args.t5[i]); writer.WriteLine("Time 6 (elem index: {0} ): {1}", i + 1, args.t6[i]); } writer.Close(); }
public static void MainTread(Queue <intPtr> queue) { Int64 t1, t2; // t1 = DateTime.Now.Ticks; // int max, min, count; // foreach (var elem in queue) // { // max = FindMax(elem); // min = FindMin(elem); // count = FindCount(elem, (max - min) / 2); // } // t2 = DateTime.Now.Ticks; // Console.WriteLine("Простая реализация: {0}\n", t2 - t1); // Console.WriteLine("\nBegin:\n"); // PrintQueue(queue); Console.WriteLine("Process:\n"); t1 = DateTime.Now.Ticks; ThreadArgs args = new ThreadArgs(queue); Thread firstThread = new Thread(new ParameterizedThreadStart(Conveyor)); firstThread.Name = "Поток 1"; Thread secondThread = new Thread(new ParameterizedThreadStart(Conveyor)); secondThread.Name = "Поток 2"; Thread thirdThread = new Thread(new ParameterizedThreadStart(Conveyor)); thirdThread.Name = "Поток 3"; firstThread.Start(args); secondThread.Start(args); thirdThread.Start(args); while (args.firstQueue.Count != 0) // && args.secondQueue.Count != 0 && args.thirdQueue.Count != 0) { if (!firstThread.IsAlive) { firstThread = new Thread(new ParameterizedThreadStart(Conveyor)); firstThread.Name = "Поток 1"; firstThread.Start(args); } if (!secondThread.IsAlive) { secondThread = new Thread(new ParameterizedThreadStart(Conveyor)); secondThread.Name = "Поток 2"; secondThread.Start(args); } if (!thirdThread.IsAlive) { thirdThread = new Thread(new ParameterizedThreadStart(Conveyor)); thirdThread.Name = "Поток 3"; thirdThread.Start(args); } } // Console.WriteLine("STATUS: 1: {0}, 2: {1}, 3: {2}\n", firstThread.IsAlive, secondThread.IsAlive, thirdThread.IsAlive); firstThread.Join(); secondThread.Join(); thirdThread.Join(); // Console.WriteLine("STATUS (после): 1: {0}, 2: {1}, 3: {2}\n", firstThread.IsAlive, secondThread.IsAlive, thirdThread.IsAlive); // log(args); t2 = DateTime.Now.Ticks; Console.WriteLine("Конвейер: {0}\n", t2 - t1); }
public static void Conveyor(object obj) { // Получили очереди. ThreadArgs args = (ThreadArgs)obj; int max, min, count; intPtr array; lock (args.firstQueue) { // Из первой очереди получили элемент. array = args.firstQueue.Dequeue(); } lock (firstStage) { // Замеряем время начала работы на первой ленте. Console.WriteLine("Лента 1 начало {0} {1}", Thread.CurrentThread.Name, DateTime.Now.Ticks); // args.t1.Add(DateTime.Now.Ticks); // Работает первая лента. max = FindMax(array); // Замеряем время конца работы на первой ленте. Console.WriteLine("Лента 1 конец {0} {1}", Thread.CurrentThread.Name, DateTime.Now.Ticks); // args.t2.Add(DateTime.Now.Ticks); } lock (args.secondQueue) { // Добавили во вторую очередь элемент. args.secondQueue.Enqueue(array); } // Console.WriteLine("Тут должна быть очередь.{0}\n", args.secondQueue.Count); lock (secondStage) { Console.WriteLine("Лента 2 начало {0} {1}", Thread.CurrentThread.Name, DateTime.Now.Ticks); // args.t3.Add(DateTime.Now.Ticks); // Работает вторая лента. lock (args.secondQueue) { // Получили из второй очереди элемент. array = args.secondQueue.Dequeue(); } min = FindMin(array); Console.WriteLine("Лента 2 конец {0} {1}", Thread.CurrentThread.Name, DateTime.Now.Ticks); // args.t4.Add(DateTime.Now.Ticks); } lock (args.thirdQueue) { // Добавили элемент в третью очередь. args.thirdQueue.Enqueue(array); } lock (thirdStage) { Console.WriteLine("Лента 3 начало {0} {1}", Thread.CurrentThread.Name, DateTime.Now.Ticks); // args.t5.Add(DateTime.Now.Ticks); // Работает третья лента. lock (args.thirdQueue) { // Получили из третьей очереди элемент. array = args.thirdQueue.Dequeue(); } count = FindCount(array, (max - min) / 2); Console.WriteLine("Лента 3 конец {0} {1}", Thread.CurrentThread.Name, DateTime.Now.Ticks); // args.t6.Add(DateTime.Now.Ticks); } }