Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 30.01.2020, 03:10   #11
Kuzya69
Пользователь
 
Регистрация: 20.07.2013
Сообщений: 42
По умолчанию

Разговор уходит не в то русло.
Мне чтобы продолжить работать с данным девайсом, достаточно закрыть порт, на котором девайс висит, и в диспетчере устройств отключить-задействовать драйвер этого порта. Но так как управлять диспетчером устройств это хлопотно, то я с помощью SetupDiSetClassInstallParams и SetupDiCallClassInstaller (ну и нескольких вспомогательных функций) делаю то-же самое.

Но это меня сейчас не волнует. Сейчас мне нужно в обработчике FirstChanceException, отделить событие с HREsult=0x80131620(System.IO.IOExce ption: Указанный порт не существует) и в этот момент сделать паузу на 200-300 мс. Если HREsult не такой, то пробросить это событие дальше. Я хочу сделать, что-то типа такого, но пока не получается получить значение HResult:
Код:
/* Program.cs */
using System;
using System.Diagnostics;
namespace Prog
{
    static class Program
    {
        static Program()
        {
            AppDomain.CurrentDomain.FirstChanceException += (sender, e) => 
            {
		uint iErrPortNotExist = 0x80131620;
		if((uint)e.Exception.HResult == iErrPortNotExist) // ругается компиллятор т.к. свойство "e.Exception.HResult" - protected
		{
		     System.Threading.Thread.Sleep(300);
		}
		else
		{
		     // как-то пробросить исключение дальше
		}
            };
        }
    }
}

Последний раз редактировалось Kuzya69; 30.01.2020 в 03:55.
Kuzya69 вне форума Ответить с цитированием
Старый 30.01.2020, 03:35   #12
Desc
Форумчанин
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 553
По умолчанию

Цитата:
Сообщение от Kuzya69 Посмотреть сообщение
Указанный порт не существует) и в этот момент сделать паузу на 200-300 мс. Если HREsult не такой, то пробросить это событие дальше.
Экспериментируйте, но как показывает практика, если порт завис и не отвечает( ему амба, только "рэсет" вернет его и реанимирует)

P. S.
Хотите тролить порты, трольте на ASM-е. Порты запомнят, Вы оцените

Последний раз редактировалось Desc; 30.01.2020 в 03:47. Причина: Добавил P. S.
Desc вне форума Ответить с цитированием
Старый 30.01.2020, 03:54   #13
Kuzya69
Пользователь
 
Регистрация: 20.07.2013
Сообщений: 42
По умолчанию

Да уже наэкспериментировался. Все работает нормально с таким кодом:
Код:
/* Program.cs */
using System;
using System.Diagnostics;
namespace Prog
{
    static class Program
    {
        static Program()
        {
            AppDomain.CurrentDomain.FirstChanceException += (sender, e) => 
            {
		System.Threading.Thread.Sleep(300);
            };
        }
    }
}
Но это не совсем удачное решение.
Kuzya69 вне форума Ответить с цитированием
Старый 30.01.2020, 04:08   #14
Desc
Форумчанин
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 553
По умолчанию

Делюсь с Вами строжайшим секретом, только Вы обещайте, никому ни-ни :
.NET - не самое удачное решение для работы с физическими портами.
как-бы-так.

P. S.
возлагаю работу с портами на ASM вставки в код(какой-то-там).

Последний раз редактировалось Desc; 30.01.2020 в 04:16. Причина: Добавил P. S.
Desc вне форума Ответить с цитированием
Старый 30.01.2020, 04:10   #15
Kuzya69
Пользователь
 
Регистрация: 20.07.2013
Сообщений: 42
По умолчанию

Ну так работает-же. И нормально работает. Вам явно просто скучно. Ни одного ответа по существу вопроса.
Kuzya69 вне форума Ответить с цитированием
Старый 30.01.2020, 04:18   #16
Kuzya69
Пользователь
 
Регистрация: 20.07.2013
Сообщений: 42
По умолчанию

Цитата:
Сообщение от Desc Посмотреть сообщение
возлагаю работу с портами на ASM вставки в код(какой-то-там).
Ага, а если приложение и под 32 и 64 бита расчитано, тогда как? На Асме запаришься такое выписывать.
Kuzya69 вне форума Ответить с цитированием
Старый 30.01.2020, 04:34   #17
Desc
Форумчанин
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 553
По умолчанию

Цитата:
Сообщение от Kuzya69 Посмотреть сообщение
Ну так работает-же. И нормально работает.
Тестировали на протяжении какого интервала времени?
Смею предположить, что запустив приложение на беспрерывную работу первого мая какого-то года и вернувшись к рабочей лошадке 1-го июля Вы с досадной улыбкой на лице будете констатировать факт не работоспособности приложения по не известной для Вас причине.
И сетуя на всякие траблы типа: электрическая сеть, перепады, батарейка в системнике, кривые руки юзера и т. д.
Налапшаете закзчику, перезапустите ПК, увидите после перезапуска норм. работу системы в целом, и осознав что Сами ни фиг. не поняли пойдете во-свояси чесать репу (что же за трабла завелась?)
*тезис взят из жизненной практики инженера наладчика "КТС АСУТП".
Так-Вот.
Desc вне форума Ответить с цитированием
Старый 30.01.2020, 04:43   #18
Kuzya69
Пользователь
 
Регистрация: 20.07.2013
Сообщений: 42
По умолчанию

Ну во первых, сама программа уже протестирована давно, и работает она стабильно. Была только одна проблема, при прошивании девайса. Именно после смены фирмваря (бут остается на месте) в устройстве, его необходимо перезагрузить. Именно эта проблема и не была решена раньше. Сейчас ее можно решить, но нужно поднимать версию фраемворка, что автоматически исключит WinXP, из поддерживаемых ОС. Поэтому я решил доработать этот казус, и вот нашел его решение. Но теперь его надо доработать. А прошивка девайса, это одноразовая операция, она требует не больше минуты времени. Больше перезагрузка девайса нигде не требуется.
Kuzya69 вне форума Ответить с цитированием
Старый 30.01.2020, 04:49   #19
Desc
Форумчанин
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 553
По умолчанию

Ни что не навязываю, поделился жизненным опытом. Всего то..
Desc вне форума Ответить с цитированием
Старый 30.01.2020, 19:19   #20
Kuzya69
Пользователь
 
Регистрация: 20.07.2013
Сообщений: 42
По умолчанию

Вроде вот так получилось.
Код:
/* Program.cs */
using System;
using System.Diagnostics;
namespace Prog
{
    static class Program
    {
        static Program()
        {
            AppDomain.CurrentDomain.FirstChanceException += (sender, e) => 
            {
		uint iErrPortNotExist = 0x80131620;
                uint iErr = (uint)Marshal.GetHRForException(e.Exception);
		if(iErr == iErrPortNotExist)
 	        {
		     System.Threading.Thread.Sleep(300);
		}
		else
		{
		     // как-то пробросить исключение дальше
		}
            };
        }
    }
}
Теперь другой вопрос возник. А нужно-ли "пробрасывать" это событие? Это ведь не само исключение, а как-бы предупреждение, о следом идущем исключении. Или я чего-то недопонял?
Kuzya69 вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перевести tm в int или другое числовое значение bambarbia Общие вопросы C/C++ 2 27.12.2012 09:55
Вывести результат (числовое значение) halloman Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 06.06.2011 07:56
Вводимое числовое значение для прозрачности skyotch JavaScript, Ajax 1 09.03.2011 11:28
Запись в числовое значение текст MRI Общие вопросы C/C++ 4 31.10.2010 10:59
текстовое значение месяца, перевести в числовое segail Microsoft Office Excel 3 08.04.2010 23:42


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS