Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2010, 15:23   #1
lexluter1988
Пользователь
 
Аватар для lexluter1988
 
Регистрация: 20.04.2010
Сообщений: 47
По умолчанию c# доступ к txt-файлу из двух процессов одновременно

Суть в следующем. Жмем recbutton и запускаем параллельный поток, который читает байты с компорта и записывает их в файл
пока не нажмем на stopbutton. одновременно по таймеру график перерисовывается (читает тот же файл)
прошу прощения за такое кол-во кода.
вот код

Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using ZedGraph;
using System.IO.Ports;
using System.Threading;

namespace LEX_SpcPlz_ver1._0
{
    public partial class blinkProject : Form
    {
        public blinkProject()
        {
            InitializeComponent();        
        }

        // Переменные, используемые для контроля 
        // за приемом данных с порта    


        bool pause = false;     // переменная говорит что остановили запись
        int k = 0;
        // как счетчик принятых байт        

        // Переменные, доступные всем классам

        // Переменные, хранящие имя файла, и путь к нему. 
        string fName;
        string fPath;

        // Переменные, хранящие настройки порта
        string portNumber;
        string baudRate;
        string dataBits;
        string parity;
        string sBits;

        // Событие при загрузке окна проекта
        private void blinkProject_Load(object sender, EventArgs e)
        {
            // устанавливаем конпки управления
            recButton.Enabled = false;
            stopButton.Enabled = false;
            resetButton.Enabled = false;

            // чтобы в шапке проекта было его имя
            Text = FileName.Name;   

            // Создаем график
            CreateGraph(zedGraphControl1);
    
           // Устанавливаем размер графика     
            SetSize();
        }

        //  Событие при закрытии окна проекта
        private void blinkProject_FormClosed(object sender, FormClosedEventArgs e)
        {
            // Мы должны очистить config.txt
            // Чтобы можно было работать с другими проектами

            StreamWriter configFile = new StreamWriter("config.txt");
            configFile.Close();

            // И очищаем глобальную переменную, которая хранит имя проекта
            FileName.Name = null;
            
        }

        // Событие при нажании на кнопку записи
        [STAThread]
        private void recButton_Click(object sender, EventArgs e)
        {
            // Устанавливаем определенное положение кнопок
            recButton.Enabled = false;
            stopButton.Enabled = true;
            resetButton.Enabled = false;

            // Запускаем таймер обновления графика           
            timer.Enabled = true;

            // разрешаем дальнейший прием даннных
            pause = false;

            // запрещаем компилятору контролировать потоки
            blinkProject.CheckForIllegalCrossThreadCalls = false;
            // создаем новый поток
            ThreadStart myThreadDelegate = new ThreadStart(MyThread);
            Thread thr = new Thread(myThreadDelegate);
            //вызываем поток
            thr.Start();

        }

        // Событие при нажатии на кнопку остановки
        private void stopButton_Click(object sender, EventArgs e)
        {
            // пауза     
            pause = true;

            // Устанавливаем определенное положение кнопок
            stopButton.Enabled = false;
            recButton.Enabled = true;
            resetButton.Enabled = true;

            // Останавливаем таймер обновления графика
            timer.Enabled = false;
        }

        // Метод установки размера графика, в зависимости от размера формы
        private void SetSize()
        {

Последний раз редактировалось lexluter1988; 30.05.2010 в 15:30.
lexluter1988 вне форума Ответить с цитированием
Старый 30.05.2010, 15:24   #2
lexluter1988
Пользователь
 
Аватар для lexluter1988
 
Регистрация: 20.04.2010
Сообщений: 47
По умолчанию

Код:
{
            zedGraphControl1.Location = new Point(10, 10);
            // Leave a small margin around the outside of the control

            zedGraphControl1.Size = new Size(ClientRectangle.Width - 20,
                                    ClientRectangle.Height - 20);
        }


        // Метод для рисования графика
        private void CreateGraph(ZedGraphControl zgc)
        {

            // присваиваем переменной имя проекта
            fName = FileName.Name;

            // формируем путь к каталогу проекта
            fPath = Path.Combine(fName, fName + "_data" + ".txt");

            // Считываем все строки файла данных в массив
            string[] lines = File.ReadAllLines(fPath);

            // Создаем полотно для рисования
            GraphPane myPane = zgc.GraphPane;

            // Удаляем уже нарисованное, чтобы
            // При обновлении графики не накладывались
            myPane.CurveList.Clear();
            

            // Подписываем оси координат
            myPane.Title.Text = "My Test Graph\n(For CodeProject Sample)";
            myPane.XAxis.Title.Text = "My X Axis";
            myPane.YAxis.Title.Text = "My Y Axis";


            // Объявляем локальные переменные, необходимые для работы
            int x, y1;

            // Создаем лист точек для рисования
            PointPairList list1 = new PointPairList();
            
            // Переменная i для индексации массива
            int i = 0;

            // Переменные для задания начала массива
            int min = 0;

            // И конца массива
            int max = lines.Length;

            // Пока не дойдем до конца массива
            while (i != max)
            {
                // Будем увеличивать счет
                x = i + 1;

                // Получаем данные
                y1 = Convert.ToInt16(lines[i]);

                // Добавляем их в лист графика
                list1.Add(x, y1);

                // Переходим к следующему элементу массива
                i++;
            }
            
            // Строим граффик
            LineItem myCurve = myPane.AddCurve("Porsche",
                  list1, Color.Red, SymbolType.Diamond);

            zgc.AxisChange();
        }

        // Событие срабатывания таймера
        private void timer_Tick(object sender, EventArgs e)
        {
            // Теперь мы должны перерисовать график
            CreateGraph(zedGraphControl1);
            
            // Изменить размер графика соответственно
            SetSize();

        }

        // Событие при изменении размера формы
        private void blinkProject_Resize(object sender, EventArgs e)
        {
           // Изменить размер графика соответственно
            SetSize();
        }

        // Событие, получающее параметры последовательного порта
        private void getPortSett_Click(object sender, EventArgs e)
        {

            // присваиваем переменной имя проекта
            fName = FileName.Name;

            // формируем путь к каталогу проекта
            fPath = Path.Combine(fName, fName + "_port" + ".txt");

            // открываем файл, хранящий параеметры порта
            StreamReader filePortSettings = new StreamReader(fPath);
            string some = filePortSettings.ReadLine();
            filePortSettings.Close();
           
                 if (some == null)
                {
                    MessageBox.Show("Введите настройки COM-порта");
                }
                else
                {
                    recButton.Enabled = true;

                    // присваиваем переменной имя проекта
                    fName = FileName.Name;
lexluter1988 вне форума Ответить с цитированием
Старый 30.05.2010, 15:24   #3
lexluter1988
Пользователь
 
Аватар для lexluter1988
 
Регистрация: 20.04.2010
Сообщений: 47
По умолчанию

Код:
// формируем путь к каталогу проекта
                    fPath = Path.Combine(fName, fName + "_port" + ".txt");

                    // открываем файл, хранящий параеметры порта
                    StreamReader PortSettings = new StreamReader(fPath);

                    // построчно читаем четыре калибровочные точки точки
                    portNumber = PortSettings.ReadLine();
                    baudRate   = PortSettings.ReadLine();
                    dataBits   = PortSettings.ReadLine();
                    parity     = PortSettings.ReadLine();
                    sBits      = PortSettings.ReadLine();

                    filePortSettings.Close();

                    // Присвоим меткам значения из файла,
                    // Хранящего конфигурацию порта

                    comLabel.Text = portNumber;
                    baudLabel.Text = baudRate;
                    dataLabel.Text = dataBits;
                    parityLabel.Text = parity;
                    stopLabel.Text = sBits;

                    serialPort1.PortName = portNumber;
                    serialPort1.BaudRate = Convert.ToInt16(baudRate);
                    serialPort1.DataBits = Convert.ToInt16(dataBits);

                    switch (sBits)
                    {
                        case "1":
                            {
                                serialPort1.StopBits = StopBits.One;
                                break;
                            }
                        case "1,5":
                            {
                                serialPort1.StopBits = StopBits.OnePointFive;
                                break;
                            }
                        case "2":
                            {
                                serialPort1.StopBits = StopBits.Two;
                                break;
                            }
                    }

                    switch (parity)
                    {
                        case "none":
                            {
                                serialPort1.Parity = Parity.None;
                                break;
                            }
                        case "odd":
                            {
                                serialPort1.Parity = Parity.Odd;
                                break;
                            }
                        case "even":
                            {
                                serialPort1.Parity = Parity.Even;
                                break;
                            }
                        case "mark":
                            {
                                serialPort1.Parity = Parity.Mark;
                                break;
                            }
                        case "space":
                            {
                                serialPort1.Parity = Parity.Space;
                                break;
                            }
                    }



                }

        }

        // Метод, который будет работать во втором потоке
        // И выводить данные в текстовое поле
        // И записывать строчки в текстовый файл


        public void MyThread()
        {
            // присваиваем переменной имя проекта
            fName = FileName.Name;

            // формируем путь к каталогу проекта
            fPath = Path.Combine(fName, fName + "_data" + ".txt");

            // открываем файл, хранящий константы калибровочной кривой
            StreamWriter fileData = new StreamWriter(fPath, true);
            // при этом мы записываем байт в конец файла, т.е. на новую строку

            // Простенький цикл, записывающий в в файл данных данные
            //   
            for (; ; k++)
            {
                // если нажали на кнопку Пауза, то запись останавливается
                if (pause)
                {
                    break;
                }
                else
                {
                    serialPort1.Open();
                    int bit = serialPort1.ReadByte();
                    serialPort1.Close();
                    fileData.WriteLine(bit);
                }
                
            }
            fileData.Close();
            // закрываем файл, чтобы не было разногласий
        }

        /////////////////////////////////////////////////////////


       




      
    }
}
lexluter1988 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зацикливание двух и более звуков играющих одновременно cstyle Мультимедиа в Delphi 2 05.05.2010 14:39
Доступ к файлу panda88 Общие вопросы Delphi 3 20.01.2010 13:34
Сортировка двух массивов одновременно antoha73 Общие вопросы Delphi 12 04.01.2010 23:14
Обращение к таблице одновременно двух AdoQuery Joe_Tribbiani БД в Delphi 1 01.06.2009 17:27
Закрыть доступ для всех процессов к файлу Sanek_ntsk Общие вопросы Delphi 6 04.12.2007 16:26