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