Считать массив строк из файла ?

Стартовая страница Форумы Разработка и интеграция Считать массив строк из файла ?

Просмотр 15 сообщений - с 16 по 30 (из 41 всего)
  • Автор
    Записи
  • #6845
    manjey73
    Участник

    Перешел на чтение ReadToEndAsync но выскакивают в начале ошибки

    2017-08-01 10:32:50 Ошибка при выполнении сеанса опроса КП: Object reference not set to an instance of an object

    Буду смотреть как поведет себя другой экземпляр.

    Собственно как от этих ошибок избавиться в начале ?

    #6846
    manjey73
    Участник
    2017-08-01 10:39:20 Сеанс связи с КП 56 "1Wire Raspberry", тип: KpDS1820
    Опрос 28-0215c221ebff
    2017-08-01 10:39:20 Ошибка при выполнении сеанса опроса КП: Object reference not set to an instance of an object
    
    2017-08-01 10:40:00 Сеанс связи с КП 56 "1Wire Raspberry", тип: KpDS1820
    Опрос 28-0215c221ebff
    2017-08-01 10:40:00 Ошибка при выполнении сеанса опроса КП: Object reference not set to an instance of an object

    И это не помогает 🙁

    #6847
    manjey73
    Участник
     public void ReadDsData()
            {
                using (sr = File.OpenRead(pathDS))
                {
                    byte[] b = new byte[512];
                    UTF8Encoding temp = new UTF8Encoding(true);
                    //sr.ReadTimeout = 2000;
                    while (sr.Read(b, 0, b.Length) > 0)
                    {
                        WriteToLog(temp.GetString(b));
                        line = temp.GetString(b);
                    }
                }
            }
    

    Вопрос, почему VS не ругается на sr.ReadTimeout, но когда запускаешь драйвер, то в логи линии связи сыпется ошибка, что Timeout не поддерживается ?

    2017-08-01 15:42:20 Сеанс связи с КП 56 «1Wire Raspberry», тип: KpDS1820
    2017-08-01 15:42:20 Ошибка при выполнении сеанса опроса КП: Timeouts are not supported on this stream.

    Ведь данный класс FileStream должен его поддерживать

    • Ответ изменён 8 лет, 12 месяцев назад пользователем manjey73.
    • Ответ изменён 8 лет, 12 месяцев назад пользователем manjey73.
    #6850
    manjey73
    Участник

    Да, и при зависании, не выводится WriteToLog, такое ощущение, что он заходит в поток и на этом зависает или даже не заходит в поток…

    using (sr = File.OpenRead(pathDS))
    {
    В эту точку я попадаю, дальше глушняк
    byte[] b = new byte[128];

    • Ответ изменён 8 лет, 12 месяцев назад пользователем manjey73.
    #6853
    manjey73
    Участник
            public void openFile()
            {
                using (FileStream file = new FileStream(pathDS, FileMode.Open, FileAccess.Read))
                {
                    WriteToLog("Поток открыт");
                    //WriteToLog(Convert.ToString(sr.BaseStream.ReadTimeout));
                    StreamReader sr = new StreamReader(file);
                    WriteToLog(Convert.ToString(DateTime.Now));
                    line = sr.ReadToEnd();
                    WriteToLog(line);
                    WriteToLog(Convert.ToString(DateTime.Now));
                    sr.Close();
                    WriteToLog("Поток закрыт");
                }
    
            }
    

    Результат, опросил три раза и заглох.

    --------------------------------------------------------------------------------
    2017-08-01 17:05:49 Инициализация линии связи 7 "DS18B20"
    2017-08-01 17:06:05 Запуск линии связи 7 "DS18B20"
    
    2017-08-01 17:06:05 Сеанс связи с КП 56 "1Wire Raspberry", тип: KpDS1820
    Поток открыт
    01.08.2017 17:06:05
    b5 02 4b 46 7f ff 0c 10 8a : crc=8a YES
    b5 02 4b 46 7f ff 0c 10 8a t=43312
    
    01.08.2017 17:07:13
    Поток закрыт
    Опрос 28-0215c221ebff
    b5 02 4b 46 7f ff 0c 10 8a : crc=8a YES
    b5 02 4b 46 7f ff 0c 10 8a t=43312
    
    2017-08-01 17:07:29 Сеанс связи с КП 56 "1Wire Raspberry", тип: KpDS1820
    Поток открыт
    01.08.2017 17:07:29
    b4 02 4b 46 7f ff 0c 10 c9 : crc=c9 YES
    b4 02 4b 46 7f ff 0c 10 c9 t=43250
    
    01.08.2017 17:07:29
    Поток закрыт
    Опрос 28-0215c221ebff
    b4 02 4b 46 7f ff 0c 10 c9 : crc=c9 YES
    b4 02 4b 46 7f ff 0c 10 c9 t=43250
    
    2017-08-01 17:08:00 Сеанс связи с КП 56 "1Wire Raspberry", тип: KpDS1820
    Поток открыт
    01.08.2017 17:08:00
    b3 02 4b 46 7f ff 0c 10 19 : crc=19 YES
    b3 02 4b 46 7f ff 0c 10 19 t=43187
    
    01.08.2017 17:08:03
    Поток закрыт
    Опрос 28-0215c221ebff
    b3 02 4b 46 7f ff 0c 10 19 : crc=19 YES
    b3 02 4b 46 7f ff 0c 10 19 t=43187
    
    2017-08-01 17:08:40 Сеанс связи с КП 56 "1Wire Raspberry", тип: KpDS1820
    Поток открыт
    01.08.2017 17:08:40
    
    #6861
    Mikhail
    Модератор

    Вопрос, почему VS не ругается на sr.ReadTimeout, но когда запускаешь драйвер, то в логи линии связи сыпется ошибка, что Timeout не поддерживается ?

    Есть ошибки компиляции, а есть ошибки времени выполнения. При компиляции не всё проверяется.

    Попробуйте using {…} взять внутрь try catch и вывести исключение в лог. Можно предположить, что ReadToEnd не зависает, а падает с ошибкой.

    #6863
    manjey73
    Участник

    Тогда почему на втором ПК все продолжает работать ?
    Я даже специально выключил линии связи эл.счетчика и 2-х плат Modbus на ПК, где зависает, не помогло. Больше отличий между ними нет.

    Завтра попробую сделать через try
    И мало того, периодически прорывает, на данный момент 13 чтений произошло, а было 3.

    Так что думаю при помощи try я ничего не отловлю, поток ждет окончания, а его почему-то нет. Ощущение, что срабатывают какие-то таймауты, а потом поток перезапускается вновь и вновь.

    прикольно, между открытием и закрытием потока 3 с лишним часа, потом несколько нормальных опросов.

    • Ответ изменён 8 лет, 12 месяцев назад пользователем manjey73.
    • Ответ изменён 8 лет, 12 месяцев назад пользователем manjey73.
    #6869
    manjey73
    Участник

    Вопрос такой, можно ли вызвать поток StreamReader и выйти из него, чтобы он остался работать в фоне и как-то контролировать процесс его выполнения ?
    например чтобы в лог была возможность выводить какие-то данные.

    Собственно ощущение, что конкретный экземпляр сессии коммуникатора зависает из-за этого, что не может дождаться завершения потока.

    #6871
    manjey73
    Участник

    Собственно поставлю вопрос иначе. В Коммуникаторе есть механизмы, которые перезапускают линию связи при длительном молчании ?

    #6876
    manjey73
    Участник
            public void ReadDsData()
            {
                string loadline = "";
                try
                {
                    using (FileStream file = new FileStream(pathDS, FileMode.Open, FileAccess.Read))
                    {
    
                        WriteToLog("Поток открыт - " + Convert.ToString(DateTime.Now));
                        //WriteToLog(Convert.ToString(sr.BaseStream.ReadTimeout));
                        StreamReader sr = new StreamReader(file);
                        loadline = sr.ReadToEnd();
                        WriteToLog(loadline);
                        sr.Close();
                        WriteToLog("Поток закрыт - " + Convert.ToString(DateTime.Now));
                    }
                }
                catch (Exception ex)
                {
                    WriteToLog(ex.ToString());
                    WriteToLog("Поток не открыт");
                    loadline = "NO";
                }
                finally
                {
                    line = loadline;
                }
            }
    

    Если я использую неправильный путь к файлу, то catch ловит исключение и выводит его в лог. Но если путь к файлу правильный то увы все там же

    2017-08-02 14:46:36 Инициализация линии связи 7 "DS18B20"
    2017-08-02 14:46:52 Запуск линии связи 7 "DS18B20"
    
    2017-08-02 14:46:52 Сеанс связи с КП 56 "1Wire Raspberry", тип: KpDS1820
    Поток открыт - 02.08.2017 14:46:52

    То есть все зависает в ожидании окончания потока, который не наступает почему-то не наступает…

    #6877
    Mikhail
    Модератор

    Вопрос такой, можно ли вызвать поток StreamReader и выйти из него, чтобы он остался работать в фоне и как-то контролировать процесс его выполнения ?

    Вы можете запустить чтение из файла в отдельном потоке. При желании его можно прервать командой Abort(). Здесь долго описывать, как это делается, проще найти пример в интернете.

    В Коммуникаторе есть механизмы, которые перезапускают линию связи при длительном молчании ?

    Нет. Всех случаев не предусмотришь в основном приложении. Это нужно сделать в драйвере.

    То есть все зависает в ожидании окончания потока

    Насколько я понял, он зависает на попытке чтения ReadToEnd

    #6881
    manjey73
    Участник

    Не только ReadToEnd, я кучу вариаций перепробовал с разными примерами Stream-ов и в байты читать и в char и ReadAllLines — все ведет себя одинаково. Как только сработала команда на чтение, все после нее молчит.

    Отсюда я даже не понимаю, как сделать Abort(), куда его втулить, чтобы он сработал ?

    А на другом ПК хоть бы хны, все варианты работают
    Дело в том, что даже в драйвере Коммуникатора не выполняется ни одной строчки ниже вызова потока…

    • Ответ изменён 8 лет, 12 месяцев назад пользователем manjey73.
    #6883
    manjey73
    Участник
    2017-08-02 16:54:40 Сеанс связи с КП 56 "1Wire Raspberry", тип: KpDS1820
    Поток открыт - 02.08.2017 16:54:40
    Опрос 28-0215c221ebff
    System.Threading.ThreadAbortException: Thread was being aborted
      at (wrapper managed-to-native) object:__icall_wrapper_mono_thread_interruption_checkpoint ()
      at (wrapper managed-to-native) System.IO.MonoIO:Read (intptr,byte[],int,int,System.IO.MonoIOError&)
      at System.IO.FileStream.ReadData (IntPtr handle, System.Byte[] buf, Int32 offset, Int32 count) [0x00000] in <filename unknown>:0 
      at System.IO.FileStream.RefillBuffer () [0x00000] in <filename unknown>:0 
      at System.IO.FileStream.ReadInternal (System.Byte[] dest, Int32 offset, Int32 count) [0x00000] in <filename unknown>:0 
      at System.IO.FileStream.Read (System.Byte[] array, Int32 offset, Int32 count) [0x00000] in <filename unknown>:0 
      at System.IO.StreamReader.ReadBuffer () [0x00000] in <filename unknown>:0 
      at System.IO.StreamReader.ReadToEnd () [0x00000] in <filename unknown>:0 
      at Scada.Comm.Devices.KpDS1820Logic.ReadDsData () [0x00000] in <filename unknown>:0 
    Поток не открыт - line=NO
    line=NO
    
    2017-08-02 16:55:20 Сеанс связи с КП 56 "1Wire Raspberry", тип: KpDS1820
    Поток открыт - 02.08.2017 16:55:20
    b7 02 4b 46 7f ff 0c 10 0c : crc=0c YES
    b7 02 4b 46 7f ff 0c 10 0c t=43437
    
    Поток закрыт - 02.08.2017 16:55:20
    line=NO
    Опрос 28-0215c221ebff
    b7 02 4b 46 7f ff 0c 10 0c : crc=0c YES
    b7 02 4b 46 7f ff 0c 10 0c t=43437
    
    2017-08-02 16:55:21 Завершение работы линии связи 7 "DS18B20"
    --------------------------------------------------------------------------------
    

    Это из лога линии. Ошибки при Thread.Abort() после Thread.Sleep(0)
    И тут же вываливает данные датчика при простом перезапуске Scada…

    #6884
    manjey73
    Участник

    Извиняюсь, выше лог при Thread.Sleep(2000), если стоит 0 то вот такое получается
    2017-08-02 17:10:00 Сеанс связи с КП 56 «1Wire Raspberry», тип: KpDS1820
    Опрос 28-0215c221ebff
    2017-08-02 17:10:00 Ошибка при выполнении сеанса опроса КП: Object reference not set to an instance of an object

    2017-08-02 17:10:40 Сеанс связи с КП 56 "1Wire Raspberry", тип: KpDS1820
    Опрос 28-0215c221ebff
    2017-08-02 17:10:40 Ошибка при выполнении сеанса опроса КП: Object reference not set to an instance of an object
    System.Threading.ThreadAbortException: Thread was being aborted
      at Scada.Comm.Devices.KpDS1820Logic.ReadDsData () [0x00000] in <filename unknown>:0 
    Поток не открыт - line=NO
    line=NO
    
    #6885
    manjey73
    Участник
    2017-08-02 17:13:03 Инициализация линии связи 7 "DS18B20"
    2017-08-02 17:13:19 Запуск линии связи 7 "DS18B20"
    
    2017-08-02 17:13:19 Сеанс связи с КП 56 "1Wire Raspberry", тип: KpDS1820
    Поток открыт - 02.08.2017 17:13:19
    bb 02 4b 46 7f ff 0c 10 33 : crc=33 YES
    bb 02 4b 46 7f ff 0c 10 33 t=43687
    
    Поток закрыт - 02.08.2017 17:13:20
    line=NO
    Опрос 28-0215c221ebff
    bb 02 4b 46 7f ff 0c 10 33 : crc=33 YES
    bb 02 4b 46 7f ff 0c 10 33 t=43687
    
    2017-08-02 17:13:29 Сеанс связи с КП 56 "1Wire Raspberry", тип: KpDS1820
    Поток открыт - 02.08.2017 17:13:29
    Опрос 28-0215c221ebff
    bb 02 4b 46 7f ff 0c 10 33 : crc=33 YES
    bb 02 4b 46 7f ff 0c 10 33 t=43687
    
    System.Threading.ThreadAbortException: Thread was being aborted
      at (wrapper managed-to-native) System.IO.MonoIO:Read (intptr,byte[],int,int,System.IO.MonoIOError&)
      at System.IO.FileStream.ReadData (IntPtr handle, System.Byte[] buf, Int32 offset, Int32 count) [0x00000] in <filename unknown>:0 
      at System.IO.FileStream.RefillBuffer () [0x00000] in <filename unknown>:0 
      at System.IO.FileStream.ReadInternal (System.Byte[] dest, Int32 offset, Int32 count) [0x00000] in <filename unknown>:0 
      at System.IO.FileStream.Read (System.Byte[] array, Int32 offset, Int32 count) [0x00000] in <filename unknown>:0 
      at System.IO.StreamReader.ReadBuffer () [0x00000] in <filename unknown>:0 
      at System.IO.StreamReader.ReadToEnd () [0x00000] in <filename unknown>:0 
      at Scada.Comm.Devices.KpDS1820Logic.ReadDsData () [0x00000] in <filename unknown>:0 
    Поток не открыт - line=NO
    line=NO
    

    При 10000, один раз считал, потом ошибки…
    Хреново он видит наличие файла датчика… точнее файл есть, но ответа от датчика он не дожидается и валит ошибку, как будто нет файла.

    • Ответ изменён 8 лет, 12 месяцев назад пользователем manjey73.
    • Ответ изменён 8 лет, 12 месяцев назад пользователем manjey73.
Просмотр 15 сообщений - с 16 по 30 (из 41 всего)
  • Для ответа в этой теме необходимо авторизоваться.