Стартовая страница › Форумы › Разработка и интеграция › Считать массив строк из файла ?
- В этой теме 40 ответов, 3 участника, последнее обновление 8 лет, 11 месяцев назад сделано
OldManSpb.
-
АвторЗаписи
-
01.08.2017 в 10:35 #6845
manjey73УчастникПерешел на чтение ReadToEndAsync но выскакивают в начале ошибки
2017-08-01 10:32:50 Ошибка при выполнении сеанса опроса КП: Object reference not set to an instance of an object
Буду смотреть как поведет себя другой экземпляр.
Собственно как от этих ошибок избавиться в начале ?
01.08.2017 в 10:40 #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И это не помогает 🙁
01.08.2017 в 15:44 #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 должен его поддерживать
01.08.2017 в 15:55 #6850
manjey73УчастникДа, и при зависании, не выводится WriteToLog, такое ощущение, что он заходит в поток и на этом зависает или даже не заходит в поток…
using (sr = File.OpenRead(pathDS))
{
В эту точку я попадаю, дальше глушняк
byte[] b = new byte[128];-
Ответ изменён 8 лет, 12 месяцев назад пользователем
manjey73.
01.08.2017 в 17:18 #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:4001.08.2017 в 19:10 #6861
MikhailМодераторВопрос, почему VS не ругается на sr.ReadTimeout, но когда запускаешь драйвер, то в логи линии связи сыпется ошибка, что Timeout не поддерживается ?
Есть ошибки компиляции, а есть ошибки времени выполнения. При компиляции не всё проверяется.
Попробуйте using {…} взять внутрь try catch и вывести исключение в лог. Можно предположить, что ReadToEnd не зависает, а падает с ошибкой.
01.08.2017 в 21:37 #6863
manjey73УчастникТогда почему на втором ПК все продолжает работать ?
Я даже специально выключил линии связи эл.счетчика и 2-х плат Modbus на ПК, где зависает, не помогло. Больше отличий между ними нет.Завтра попробую сделать через try
И мало того, периодически прорывает, на данный момент 13 чтений произошло, а было 3.Так что думаю при помощи try я ничего не отловлю, поток ждет окончания, а его почему-то нет. Ощущение, что срабатывают какие-то таймауты, а потом поток перезапускается вновь и вновь.
прикольно, между открытием и закрытием потока 3 с лишним часа, потом несколько нормальных опросов.
01.08.2017 в 21:58 #6869
manjey73УчастникВопрос такой, можно ли вызвать поток StreamReader и выйти из него, чтобы он остался работать в фоне и как-то контролировать процесс его выполнения ?
например чтобы в лог была возможность выводить какие-то данные.Собственно ощущение, что конкретный экземпляр сессии коммуникатора зависает из-за этого, что не может дождаться завершения потока.
02.08.2017 в 08:47 #6871
manjey73УчастникСобственно поставлю вопрос иначе. В Коммуникаторе есть механизмы, которые перезапускают линию связи при длительном молчании ?
02.08.2017 в 15:00 #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То есть все зависает в ожидании окончания потока, который не наступает почему-то не наступает…
02.08.2017 в 16:14 #6877
MikhailМодераторВопрос такой, можно ли вызвать поток StreamReader и выйти из него, чтобы он остался работать в фоне и как-то контролировать процесс его выполнения ?
Вы можете запустить чтение из файла в отдельном потоке. При желании его можно прервать командой Abort(). Здесь долго описывать, как это делается, проще найти пример в интернете.
В Коммуникаторе есть механизмы, которые перезапускают линию связи при длительном молчании ?
Нет. Всех случаев не предусмотришь в основном приложении. Это нужно сделать в драйвере.
То есть все зависает в ожидании окончания потока
Насколько я понял, он зависает на попытке чтения ReadToEnd
02.08.2017 в 16:26 #6881
manjey73УчастникНе только ReadToEnd, я кучу вариаций перепробовал с разными примерами Stream-ов и в байты читать и в char и ReadAllLines — все ведет себя одинаково. Как только сработала команда на чтение, все после нее молчит.
Отсюда я даже не понимаю, как сделать Abort(), куда его втулить, чтобы он сработал ?
А на другом ПК хоть бы хны, все варианты работают
Дело в том, что даже в драйвере Коммуникатора не выполняется ни одной строчки ниже вызова потока…-
Ответ изменён 8 лет, 12 месяцев назад пользователем
manjey73.
02.08.2017 в 16:57 #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…02.08.2017 в 17:11 #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 object2017-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=NO02.08.2017 в 17:15 #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 месяцев назад пользователем
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.