Найти ошибки в многопоточном приложении - C#
Формулировка задачи:
1 поток- нахождение среднекв.отклонения каждых 1000 элементов
2 поток- сумма каждых ста элементов
помогите разобраться, что начудила и почему не работает =(
using System.IO; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; // Поддержка многопоточности using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Thread myThread = new Thread(Function); // Создаем новый объект потока (Thread) myThread.Start(); // запускаем поток } public class Processor { private double[] Massiv1; private int count_str = 0; private int count_i = 0; private double rezult = 0; private double tmp_w = 0; private bool flag = false; public List<double> list_result; public List<double> list_result2; object locker = new object(); private double sum2; public Processor() { this.writeFile(); this.Massiv1 = new double[1000]; list_result = new List<double>(); } private void writeFile() { Random rnd = new Random(); System.IO.StreamWriter sw = new System.IO.StreamWriter("First_set.txt"); for (int i = 0; i < 10000; i++) { sw.WriteLine(rnd.Next(1000) + rnd.NextDouble()); } sw.Close(); Console.WriteLine("Создание файла и запись 10000 строк в него выполнено! \n"); } private double[] readFile() { int i = 0; StreamReader sr = new StreamReader("First_set.txt"); for (int j = 0; j < count_i + 1000; j++) { if (j == this.count_str) { this.Massiv1[i] = Convert.ToDouble(sr.ReadLine()); i++; this.count_str++; } else { this.tmp_w = Convert.ToDouble(sr.ReadLine()); } } sr.Close(); Console.WriteLine("Чтение из файла строк с " + this.count_i + " по " + this.count_str + " выполнено!"); this.count_i = this.count_str; return this.Massiv1; } public double Calculation(double[] Massiv1) { double sum = 0; double sArifm = 0; double disp = 0; double sko = 0; for (int i = 0; i < 1000; i++) sum = sum + this.Massiv1[i]; // сумма всех элементов в строке sArifm = sum / 10000; // среднее арифметическое чисел строки for (int i = 0; i < 1000; i++) disp = sum + Math.Pow(this.Massiv1[i] - sArifm, 2); // дисперсия sko = Math.Sqrt(sum / 1000); // среднее квадратичное отклонение return sko; } private void fun() { this.rezult = this.rezult / 100; this.list_result.Add(this.rezult); System.IO.StreamWriter swr = new System.IO.StreamWriter("Second_set.txt"); for (int i = 0; i < this.list_result.Count; i++) swr.WriteLine(this.list_result[i]); swr.Close(); Console.WriteLine("Запись " + this.count_str / 1000 + " результата в файл выполнено! \n"); } private static void Function() { Processor p = new Processor(); { p.readFile2(); p.list_result = new List<double>(); } } private double[] readFile2() { int i = 0; StreamReader sr = new StreamReader("Second_set.txt"); for (int j = 0; j < count_i + 10; j++) { if (j == this.count_str) { this.Massiv1[i] = Convert.ToDouble(sr.ReadLine()); i++; this.count_str++; } else { this.tmp_w = Convert.ToDouble(sr.ReadLine()); } } sr.Close(); Console.WriteLine("Чтение из файла строк с " + this.count_i + " по " + this.count_str + " выполнено!"); this.count_i = this.count_str; return this.Massiv1; } public double Calculation_2(double[] Massiv1) { double sum2 = 0; for (int i = 0; i < 100; i++) sum2 = sum2 + this.Massiv1[i]; return sum2; } private void fun_2() { list_result2.Add(sum2); StreamWriter swr = new StreamWriter("Third_set.txt"); for (int i = 0; i < list_result2.Count; i++) swr.WriteLine(list_result2[i]); swr.Close(); Console.WriteLine("Запись " + this.count_str / 1000 + " результата в файл выполнено! \n"); } private void getResult() { while (this.count_str < 10000) { lock (locker) { if (!this.flag) { Console.WriteLine("Работает поток " + Thread.CurrentThread.Name); this.rezult = this.Calculation(this.readFile()); this.flag = true; } else { Console.WriteLine("Работает поток " + Thread.CurrentThread.Name); this.fun(); this.flag = false; } } } }}}}
Решение задачи: «Найти ошибки в многопоточном приложении»
textual
Листинг программы
using System.IO; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; // Поддержка многопоточности using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Processor p = new Processor(); Thread t1 = new Thread(p.Average100) { Name = "Средние значения" }; Thread t2 = new Thread(p.Deviation1000) { Name = "Отклонения" }; t1.Start(); t2.Start(); t1.Join(); t2.Join(); Console.WriteLine("Готово"); Console.ReadKey(); } } public class Processor { private static Random rnd = new Random(); private double[] data; private object locker; public Processor() { locker = new object(); data = ReadFile(); CreateFile(); } private void CreateFile() { using (StreamWriter sw = new StreamWriter("First_set.txt", false)) { for (int i = 0; i < 10000; i++) { sw.WriteLine(rnd.Next(1000) + rnd.NextDouble()); } } } private double[] ReadFile() { List<double> values = new List<double>(); using (StreamReader sr = new StreamReader("First_set.txt")) { while (!sr.EndOfStream) { values.Add(double.Parse(sr.ReadLine())); } } return values.ToArray(); } private double StandartDeviation(double[] array) { double average = Average(array); double disp = 0; for (int i = 0; i < array.Length; i++) { disp += (array[i] - average) * (array[i] - average); } return Math.Sqrt(disp / array.Length); } private double Average(double[] array) { double sum = 0; for (int i = 0; i < array.Length; i++) { sum += array[i]; } return sum / array.Length; } public void Average100() { int size; lock (locker) size = data.Length; for (int i = 0; i < size / 100 - 1; i++) { lock (locker) { double[] toCalc = new double[100]; Array.Copy(data, i * 100, toCalc, 0, 100); double av = Average(toCalc); Console.WriteLine("Поток {0}: ({1}-{2}), результат {3}", Thread.CurrentThread.Name, i * 100, (i + 1) * 100, av); } } } public void Deviation1000() { int size; lock (locker) size = data.Length; for (int i = 0; i < size / 1000 - 1; i++) { lock (locker) { double[] toCalc = new double[1000]; Array.Copy(data, i * 1000, toCalc, 0, 1000); double dev = StandartDeviation(toCalc); Console.WriteLine("Поток {0}: ({1}-{2}), результат {3}", Thread.CurrentThread.Name, i * 1000, (i + 1) * 1000, dev); } } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д