Exemplo n.º 1
0
        static void Run(int N, string[] files)
        {
            //Последовательный алгоритм
            using (StreamWriter stream = new StreamWriter(@"D:\OneDrive\Parall2\Output.txt", true))
            {
                stream.WriteLine("Последовательный алгоритм");
            }
            DateTime d1 = DateTime.Now;

            foreach (var file in files)
            {
                Schemas.MakeBlack_White(file);
            }
            DateTime d2 = DateTime.Now;

            using (StreamWriter stream = new StreamWriter(@"D:\OneDrive\Parall2\Output.txt", true))
            {
                stream.WriteLine("\nОбработано изображений: {0}\n", N.ToString());
                stream.WriteLine("Затраченное время: {0} мс\n", (d2 - d1).TotalMilliseconds.ToString());
            }
            Console.WriteLine("Выполнено: Последовательный алгоритм");

            //параллельные версии

            var    cts = new CancellationTokenSource();
            Thread thr = new Thread(() => {
                while (true)
                {
                    Thread.Sleep(100);
                    //Возвращает значение, указывающее на событие нажатия клавиши (во входном потоке).
                    if (Console.KeyAvailable)
                    {
                        Console.ReadKey(true);
                        //планировщик отменяет еще не запланированные действия
                        cts.Cancel();
                    }
                }
            });

            thr.Start();
            var Options = new ParallelOptions()
            {
                MaxDegreeOfParallelism = maxParall,
                //получаем сигнал отмены
                CancellationToken = cts.Token
            };

            //parallelFor
            using (StreamWriter stream = new StreamWriter(@"D:\OneDrive\Parall2\Output.txt", true))
            {
                stream.WriteLine("\nПараллельный алгоритм");
            }
            Schemas.Info = new ConcurrentBag <Schemas.TaskDetails>();
            Parallel.For(0, N, Options, i =>
            {
                Schemas.Work(files[i]);
            });

            Schemas.PrintThreadsInfo();
            Schemas.PrintShemaInfo();

            Console.WriteLine("Выполнено: Параллельный алгоритм");
            //стандартная схема
            using (StreamWriter stream = new StreamWriter(@"D:\OneDrive\Parall2\Output.txt", true))
            {
                stream.WriteLine("\nСтандартная схема");
            }
            Schemas.Info = new ConcurrentBag <Schemas.TaskDetails>();
            Parallel.ForEach(files, Options, Schemas.Work);
            Schemas.PrintThreadsInfo();
            Schemas.PrintTaskInfo();
            Schemas.PrintShemaInfo();

            Console.WriteLine("Выполнено: Cтандартная схема");
            //сбалансированная схема
            using (StreamWriter stream = new StreamWriter(@"D:\OneDrive\Parall2\Output.txt", true))
            {
                stream.WriteLine("\nСбалансированная схема");
            }
            Schemas.Info = new ConcurrentBag <Schemas.TaskDetails>();
            var PartedData = Partitioner.Create(files, true);

            Parallel.ForEach(PartedData, Options, Schemas.Work);
            Schemas.PrintThreadsInfo();
            Schemas.PrintTaskInfo();
            Schemas.PrintShemaInfo();
            Console.WriteLine("Выполнено: Сбалансированная схема");
            //Статическая схема
            using (StreamWriter stream = new StreamWriter(@"D:\OneDrive\Parall2\Output.txt", true))
            {
                stream.WriteLine("\nСтатическая схема");
            }
            Schemas.Info = new ConcurrentBag <Schemas.TaskDetails>();
            Parallel.ForEach(Partitioner.Create(0, N), Options, range => {
                for (int i = range.Item1; i < range.Item2; i++)
                {
                    Schemas.Work(files[i]);
                }
            });
            Schemas.PrintThreadsInfo();
            Schemas.PrintTaskInfo();
            Schemas.PrintShemaInfo();

            Console.WriteLine("Выполнено: Статическая схема");
            //Статическая схема с фиксированным размером блока
            using (StreamWriter stream = new StreamWriter(@"D:\OneDrive\Parall2\Output.txt", true))
            {
                stream.WriteLine("\nСтатическая схема с фиксированным размером блока");
            }
            Schemas.Info = new ConcurrentBag <Schemas.TaskDetails>();
            Parallel.ForEach(Partitioner.Create(0, N, N / (maxParall)), Options,
                             range => {
                for (int i = range.Item1; i < range.Item2; i++)
                {
                    Schemas.Work(files[i]);
                }
            });
            Schemas.PrintThreadsInfo();
            Schemas.PrintTaskInfo();
            Schemas.PrintShemaInfo();

            Console.WriteLine("Выполнено: Статическая схема с фиксированным размером блока");
        }