|
Вопрос # 2 532/ вопрос открыт / |
|
Здравствуйте!
Моя программа на дельфи принимает и передает сообщения через Com порт (используется компонент TBComPort). Все работает корректно, даже с переходником USBtoCOM, но есть нюанс. Если не закрыв программу отключить кабель (в районе usb разъема), то программа зависает (например, при закрытии окна), т.к. открытого порта больше не существует. Кто подскажет как правильно в этой ситуации решить проблему?
 |
Вопрос задал: anbaresi (статус: Посетитель)
Вопрос отправлен: 16 марта 2009, 20:31
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 11; последнее сообщение — 30 марта 2009, 18:03; участников в обсуждении: 3.
|
Вадим К (статус: Академик), 16 марта 2009, 21:03 [#1]:
Маловато информации в вопросе.
Дополните такими ответами
- работа с сомпортом в синхронном или асинхронном режиме
- компоннет для сом портра в отдельном потоке или основном
- обмен информацией по сом порту идет постоянно или время от времени
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Косолапов Дмитрий Юрьевич (статус: 8-ой класс), 17 марта 2009, 09:19 [#2]:
Вообще-то ком-порты не предназначены для "горячего" подключения/отключения.
|
|
Вадим К (статус: Академик), 17 марта 2009, 11:02 [#3]:
Вообще то да, согласен. Но это дело можно отследить таймаутами. Почему я собственно и сформулировал вышеприведённые вопросы. А не зная, как там всё работает у человека внутри, советовать рано.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
anbaresi (статус: Посетитель), 17 марта 2009, 21:58 [#4]:
Работа с портом в асинхронном режиме
В основном потоке
Обмен информации - время от времени.
Т.к. используется переходник USBtoCOM, то горячее вкл\откл возможно, но в районе usb
Но как мне кажется в данном случае это не важно, т.к. проблема в том, что при отключении переходника Сом порт исчезает из системы, а он в программе открыт и даже если обмена в этот момент нет, то при закрытии окна программы просходит ее зависании (т.к. надо закрыть несуществующий порт).
Я так думаю, что надо отслеживать наличие порта в системе (не "подключен" или "неподключен"), а именно наличие открытого порта в системе. Вот только как это сделать?
Может я и не прав, тогда подскажите в чем и в каком направлении соображать дальше?
|
|
Вадим К (статус: Академик), 18 марта 2009, 00:12 [#5]:
Асинхронном режиме пропадание порта не так смертельно. Конечно, правильное решение будет такое, как например в Нокии. когда перепрошиваешь телефон (и не важно, что это USB), они пишут - разорвешь - ничего не получиться, а может и в сервис центре не спасут.
Но отследить пропадание порта можно. Если внимательней посмотрите этот же компонент, то он позволяет показывать список компортов в системе. просто перед закрытием проверяем и решаем. В некоторых случаях достаточно проблему прикрыть и пока пользователи пользуются, искать более красивые пути.
Но вот с этим компонентом я не знаю, не составляет ли он один раз список...
а в целом составить список не так сложно - это просто чтение нужной ветки рееста, они там все.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
anbaresi (статус: Посетитель), 18 марта 2009, 21:21 [#6]:
Уточню по сути.
Если отключить кабель раньше, чем закрыть программу, то при закрытии программы выдается "Ошибка EscapeCommFunction" и после этого любое обращение из программы к любому порту невозможно и закрыть программу корректно (без убийства процесса) невозможно.
Да, я прочитал ветку реестра, да я нашел, что порт несуществует. Но остается непонятным, что делать дальше, как избежать ошибки?
|
|
Вадим К (статус: Академик), 18 марта 2009, 21:32 [#7]:
не дергать шнур. и никаких проблем. Но всё же. если было обнаружено, что порт пропал, то закрывать его не нужно. Наверно придется пропатчить компонент, что бы он допускал выполнение деструктора без закрытия порта.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
anbaresi (статус: Посетитель), 19 марта 2009, 10:40 [#8]:
Если бы еще знать как пропатчить компонент
|
|
Вадим К (статус: Академик), 19 марта 2009, 11:05 [#9]:
открываем исходники, ищем деструктор и смотрим, что там. потом думаем, что туда можно добавить, что бы сделать вызов деструктора без вызова закрытия порта и вообще каких-либо посылок в порт. Я бы например ввел поле типа "InvalidState" и если оно истина, то вся работа с портом пропускается.
После правки исходников компонент надо будет переустановить. В некоторых случаях надо удалить dcu файл от него вручную.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
anbaresi (статус: Посетитель), 19 марта 2009, 11:43 [#10]:
Да, с трудом я себе представляю эту работу, но похоже придется разбираться
|
|
anbaresi (статус: Посетитель), 30 марта 2009, 18:03 [#11]:
Ситуация решается использование try except. Проверено - все корректно. Тем не менее я связался с разработчиком и вроде бы он подправил компонент, но это я не проверял.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|