Найти ошибки в многопоточном приложении - 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);
}
}
}
}
}