Показано с 1 по 4 из 4

Тема: C# скрипт, запись в файл значений

  1. #1

    По умолчанию C# скрипт, запись в файл значений

    Добрый день! Столкнулся со следующей проблемой - в модуле скриптов реализовал функцию, обрабатывающую параметр, и вторую функцию, записывающую в файл эти параметры. Обе они выполняются в одном отдельном потоке. Но по какой то причине, функция записи записывает не конечные значения, которые должны быть после выполнения функции, а "почти" конечные, промежуточные. Думаю что проблема в синхронизации потоков.

    Вот функции:

    void linearTransform(uint paramsNum,double t,params object[]parameters){//триплеты из : имя переменной, мин.знач., максимальное знач.
    if (parameters.Length/3!=paramsNum){
    return ;
    }
    double []b=new double[paramsNum];
    double []k=new double[paramsNum];
    double []value=new double[paramsNum];
    double t1=0,t2=t*1000;
    //рассчет коэф. б
    for(int i=0;i<paramsNum;i++){
    b[i]=Convert.ToDouble(parameters[3*i+1]);
    }
    //рассчет коэф. к
    for(int i=0;i<paramsNum;i++){
    k[i]=(Convert.ToDouble(parameters[3*i+2])-b[i])/t2;
    }
    //в течение каждой сек. присваиваем у=кх+в
    for(t1=0;t1<=t2;t1=t1+20){
    for(int i=0;i<paramsNum;i++){
    value[i]=k[i]*t1+b[i];
    setValue(Convert.ToString(parameters[3*i]),value[i]);
    }
    //на последней итерации паузы быть не должно
    if(t1!=t2){
    Thread.Sleep(20);
    }
    }
    }

    public void writeParamsToReport(params object[] parameterNames){

    using (FileStream fstream=new FileStream(@"C:\log.txt", FileMode.Append))
    {
    string time="\r\n";
    for(int i=0;i<parameterNames.Length;i++){
    time=time+Convert.ToString(parameterNames[i])+" = "
    +Convert.ToString(getValue(Convert.ToString(parame terNames[i])))
    +"\r\n";
    }
    byte[] text=System.Text.Encoding.Default.GetBytes(time);
    fstream.Write(text,0,text.Length);
    }
    }

    их вызов:
    linearTransform(1,5,"Nгп",Convert.ToDouble(getValu e("Nгп")),1600);
    writeParamsToReport("Nгп");

    если между ними поставить Thread.Sleep(1000) то запись отрабатывает корректно. Но это не очень хорошее решение.

    Помогите пожалуйста разобраться, заранее спасибо.

  2. #2
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    10,583

    По умолчанию

    а просто сделать bool переменную, по взведению которой делать запись ?
    То есть присвоили значение, "готов" в true
    Если (готов) запись., сброс "готов" в false

  3. #3

    По умолчанию

    Да, делал и так, и через ManualResetEvent. Думается мне что происходит это по причине того, что обрабатываю переменные в дочернем потоке, а хранятся они в другом.

  4. #4

    По умолчанию

    А зачем вообще так делать?
    По фронту или просто по значению вызывайте выполнение записи в файл и все. Если хотите чтобы Скрипт не положил зависанием систему, то положите его в отдельный объекта, у объекта поставьте флаг "Собственный цикл". Но при работе с файлами это как правило не требуется.
    Спасибо.

Похожие темы

  1. Запись в файл
    от Alex12345 в разделе ПЛК1хх
    Ответов: 16
    Последнее сообщение: 19.03.2015, 16:50
  2. СПК-107 (Запись на флеш через файл)
    от ru522464 в разделе СПК1хх
    Ответов: 1
    Последнее сообщение: 27.02.2014, 13:54
  3. запись тревог в файл на плк
    от rabitt.exe в разделе ПЛК1хх
    Ответов: 7
    Последнее сообщение: 10.02.2010, 17:54

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •