boost::serial_port и мозговой секс
От: HolyNick  
Дата: 25.10.14 18:39
Оценка: -2
Добрый вечер.
Интересует вопрос по boost::serial_port.
В порт передается объект io_service. Открываю порт, делаю чтение, потом закрываю порт. Если в io_service остаются handler'ы то повторно порт открыть нельзя. Сам же io_service удаляет handler's только при вызове деструктора. Те удается снова открыть порт когда сделан shut_down (те был вызван деструктор) для io_service, в противном случае выдает ошибку access denied.

Если делать так получается вообще что-то невразумительное:
class MySerialPort : public std::enable_shared_from_this<MySerialPort>
{
MySerialPort()
 : Port(Service)
{
}
...
void Read()
{
  auto self(shared_from_this());
  boost::asio::async_read(Port, boost::asio::buffer(&Buffer, 1),
        [this, self](const boost::system::error_code& error, std::size_t bytes_transferred)
    {
        ...
        ...
    }
}

boost::io_service Service;
boost::serial_port Port;
}

Если где-то есть
std::shared_ptr<MySerialPort> MyPort;
..
..
а потом где-то где-то
MyPort.reset();

то если в Service есть(например после вызовов Read) ссылки на объект MyPort, то по сути деструктор MyPort не будет вызван.
Service останется где-то висеть с ссылками на MyPort. Утечка памяти. Порт повторно открыть будет нельзя (выдает acces denied).


Правильно понимаю, что io_service всегда должен передаваться в MySerialPort только извне и уничтожать(вызов деструктора) всегда раньше чем сам MySerialPort?
При этом сам MySerialPort объект тоже должен уничтожаться ибо ссылается на io_service.?
Re: boost::serial_port и мозговой секс
От: niXman Ниоткуда https://github.com/niXman
Дата: 25.10.14 20:44
Оценка:
io_service должен создаваться раньше всего его использующего, и разрушаться позже всего.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: boost::serial_port и мозговой секс
От: HolyNick  
Дата: 26.10.14 08:46
Оценка:
Так не всегда удобно удобно делать.
Можно можно сделать shutdown для сервиса, этот , вариант, вроде работает.
Re[3]: boost::serial_port и мозговой секс
От: niXman Ниоткуда https://github.com/niXman
Дата: 26.10.14 12:36
Оценка:
Здравствуйте, HolyNick, Вы писали:

HN>Можно можно сделать shutdown для сервиса, этот , вариант, вроде работает.

у io_service нет метода shutdown(), и у serial_port — тоже.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: boost::serial_port и мозговой секс
От: niXman Ниоткуда https://github.com/niXman
Дата: 26.10.14 12:39
Оценка: +1
Здравствуйте, HolyNick, Вы писали:

HN>
HN>class MySerialPort : public std::enable_shared_from_this<MySerialPort>
HN>{
HN>MySerialPort()
HN> : Port(Service)
HN>{
HN>}
HN>...
HN>void Read()
HN>{
HN>  auto self(shared_from_this());
HN>  boost::asio::async_read(Port, boost::asio::buffer(&Buffer, 1),
HN>        [this, self](const boost::system::error_code& error, std::size_t bytes_transferred)
HN>    {
HN>        ...
HN>        ...
HN>    }
HN>}

HN>boost::io_service Service;
HN>boost::serial_port Port;
HN>}
HN>


а это что за чудо? =))
у тебя что, на каждый объект MySerialPort создается по io_service`у?
доку не пробовал читать? ну, или, экзамплы посмотреть
срань какая..
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 26.10.2014 12:40 niXman . Предыдущая версия .
Re[4]: boost::serial_port и мозговой секс
От: HolyNick  
Дата: 26.10.14 12:54
Оценка:
Есть метод shutdown у реализации сервиса. io_service это лишь оболочка над реализацией.
Re[2]: boost::serial_port и мозговой секс
От: HolyNick  
Дата: 26.10.14 13:04
Оценка:
Вообще хочу использовать (и раньше использовал) один сервис. Но одним сервисом на несколько портов не получается разрулить ситуацию:
1. Закрываю порт
2. В сервисе в очереди остались какие-то задания для порта
3. Снова открываю тот же порт — в результате access denied.

Если был вызван деструктор (или shutdown) для сервиса, то порт снова нормально(пункт 3) открывается.
Может и не в деструкторе\shutdown дело, пока не понял.
Re: boost::serial_port и мозговой секс
От: smeeld  
Дата: 26.10.14 13:21
Оценка:
Здравствуйте, HolyNick, Вы писали:


HN>В порт передается объект io_service. Открываю порт, делаю чтение, потом закрываю порт. Если в io_service остаются handler'ы то повторно порт открыть нельзя.


А что означает, "остаются хендлеры"? " Это зарегестрированные на асинхронное исполнение по
поступлению события? Ну тогда сам порт ИМХО нужно уничтожать в одном из таких хендлеров
после того и в результате того, как они будут исполнены. В противном случае нужно юзать синхронные
обрабтчики. Никаких async*
Re[5]: boost::serial_port и мозговой секс
От: niXman Ниоткуда https://github.com/niXman
Дата: 26.10.14 13:29
Оценка:
Здравствуйте, HolyNick, Вы писали:

HN>Есть метод shutdown у реализации сервиса.

хз, никогда не видел и не слышал, и не было надо...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[5]: boost::serial_port и мозговой секс
От: niXman Ниоткуда https://github.com/niXman
Дата: 26.10.14 13:30
Оценка:
Здравствуйте, HolyNick, Вы писали:

HN>Есть метод shutdown у реализации сервиса. io_service это лишь оболочка над реализацией.

дай ссылку на доку.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: boost::serial_port и мозговой секс
От: niXman Ниоткуда https://github.com/niXman
Дата: 26.10.14 13:33
Оценка:
Здравствуйте, HolyNick, Вы писали:

HN>Вообще хочу использовать (и раньше использовал) один сервис. Но одним сервисом на несколько портов не получается разрулить ситуацию:

HN>1. Закрываю порт
о чем речь?

HN>2. В сервисе в очереди остались какие-то задания для порта

хз что за "порт" и как он закрывается, но с сокетами и файловыми дескрипторами — при закрытии — все хендлеры выполняются сразу же, с соответствующим error_code.

HN>3. Снова открываю тот же порт — в результате access denied.

хз что за "порт", и как он открывается...

HN>Если был вызван деструктор (или shutdown) для сервиса, то порт снова нормально(пункт 3) открывается.

HN>Может и не в деструкторе\shutdown дело, пока не понял.
хз что за shutdown, такое я видел только у сокета...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[6]: boost::serial_port и мозговой секс
От: HolyNick  
Дата: 26.10.14 13:38
Оценка:
class MyPort : ...
{
    ...
    ...
    void ShutDownService()
    {
        auto& impl = boost::asio::use_service<boost::asio::detail::io_service_impl>(Service);
        impl.shutdown_service();
    }
    ...
    ...
    boost::asio::io_service Service;
};


Подробнее в io_service.hpp.
Re[7]: boost::serial_port и мозговой секс
От: niXman Ниоткуда https://github.com/niXman
Дата: 26.10.14 13:40
Оценка:
дай ссылку на доку.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: boost::serial_port и мозговой секс
От: HolyNick  
Дата: 26.10.14 13:47
Оценка:
S>А что означает, "остаются хендлеры"? " Это зарегестрированные на асинхронное исполнение по
S>поступлению события?

Да.

S>Ну тогда сам порт ИМХО нужно уничтожать в одном из таких хендлеров

S>после того и в результате того, как они будут исполнены. В противном случае нужно юзать синхронные
S>обрабтчики. Никаких async*

А как порт уничтожить, если хендлер висит в очереди в сервисе и он не вызывается на обработку.
(Те может че-то такое и можно провернуть — изучать надо.)
Да и постоянно порт создавать\удалять можно конечно, но хотелось бы обойтись.
Хочу асинхронные

Те такая (примерно пишу) штука вот уже не будет работать:
boost::asio::io_service service;
boost::asio::serial_port port(service);
port.open(portAddress.toStdString());
if (port.is_open())
{
    std::uint8_t Buffer;
    boost::asio::async_read(port, boost::asio::buffer(&Buffer, 1),
        [this](const boost::system::error_code& error, std::size_t bytes_transferred)
    {
           //допустим ничего считать нельзя и просто будет поставлено задание в очередь
    });
    port.close();
    port.open(portAddress.toStdString()); //access denied
}
Re[3]: boost::serial_port и мозговой секс
От: smeeld  
Дата: 26.10.14 13:56
Оценка:
Здравствуйте, HolyNick, Вы писали:

HN>А как порт уничтожить, если хендлер висит в очереди в сервисе и он не вызывается на обработку.


Обработку в виде вызова асинхронного хендлера может вызвать внешнее событие,
например, появление данных на дескрипторе, доступных на чтение, или появление
возможности записи. Если таковых событий не произошло, то зачем уничтожать порт?
Если они произошли, то будет вызван хендлер, в котором проведём все работы
по вводу/выводу, после чего или повесим новый хендлер, для ожидания новых событий,
или грохнем сокет/порт. Тогда в внутренних очередях io_service не будут оставаться,
осиротевшие хендлеры.
Re[3]: boost::serial_port и мозговой секс
От: Evgeny.Panasyuk Россия  
Дата: 26.10.14 14:03
Оценка:
Здравствуйте, HolyNick, Вы писали:

HN>Те такая (примерно пишу) штука вот уже не будет работать:

HN>
HN>    port.close();
HN>


.close() по идее должен завершать все хэндлеры с boost::asio::error::operation_aborted.
Этот код точно не работает? А если создать полностью новый serial_port, после деструкции старого? (можно использовать optional<serial_port>)
Re[4]: boost::serial_port и мозговой секс
От: HolyNick  
Дата: 26.10.14 15:02
Оценка:
Да должен.
Такой (с новым портом) код тоже у меня не работает:
boost::asio::io_service service;
boost::asio::serial_port port(service);
port.open(portAddress.toStdString());
if (port.is_open())
{
    std::uint8_t Buffer;
    boost::asio::async_read(port, boost::asio::buffer(&Buffer, 1),
        [this](const boost::system::error_code& error, std::size_t bytes_transferred)
    {
        int i = 0;
        i++;
        //сюдя в отладчике не попадаю
    });
    port.close();

    boost::asio::serial_port newPort(service);
    newPort.open(portAddress.toStdString()); //access denied
}
Отредактировано 26.10.2014 15:03 HolyNick . Предыдущая версия .
Re[4]: boost::serial_port и мозговой секс
От: niXman Ниоткуда https://github.com/niXman
Дата: 26.10.14 15:40
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>.close() по идее должен завершать все хэндлеры с boost::asio::error::operation_aborted.

нет. при close(), хендлеры вызовутся с end_of_file, а при cancel() — operation_aborted
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 26.10.2014 15:42 niXman . Предыдущая версия .
Re[5]: boost::serial_port и мозговой секс
От: niXman Ниоткуда https://github.com/niXman
Дата: 26.10.14 15:42
Оценка:
вообще, такое ощущение, что ТС не понимает что делает/хочет_сделать, и не понимает что говорит. его ответы/вопросы и ответы на вопросы — какие-то непоследовательные, оторванные...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[6]: boost::serial_port и мозговой секс
От: HolyNick  
Дата: 26.10.14 15:55
Оценка:
Отредактировано 26.10.2014 15:56 HolyNick . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.