Задать вопрос
  • Как правильно организовать вечный цикл в отдельном потоке C++11?

    @Vorotislav Автор вопроса
    Дмитрий: попытаюсь более подробно рассказать. Сразу предупрежу, что всё, что я сейчас делаю, для меня новое (select, epoll, thread), и изучаю по мере продвижения. Основная программа крутит у себя вечный цикл и помимо работы с сетью исполняет еще кучу задач. Изначально, у меня было всё на select'ах. На каждой итерации цикла я лез в класс-транспорт, и вызывал функцию селекта, пробегал по всем сокетам, смотрел есть ли данные. И вроде всё было хорошо, пока не столкнулся с такой проблемой, что если один сокет внезапно обрывается, я не нашел как из FD_ISSET вытащить именно оборвавшийся чтобы корректно его закрыть. Чтобы не сильно тормозить разработку, почитал сначала про poll, ну и в интернетах везде писали, что poll конечно хорош, но вот epoll это прям вообще бомба. Ну и думаю, а дай его попробую Он уже и показывал какой сокет оборвался, корректно его завершаю, программа не выдаёт кучу ошибок. В общем мне понравилось всё, за исключением того, что пока ведется разработка нагрузки нет, и если поставить epoll'у таймаут -1, то у меня цикл в основной программе дальше не идёт. Сначала сделал таймаут = 0, и так же, как в случае с select'ом на каждой итерации дергал функцию. Мне не нравится такой подход, к тому же этот класс транспорт будет использован в других программах компании, и надо сделать прям всё правильно. Начал копать в сторону тредов. Вынести обработку epoll'а в отдельную нитку, которая была бы не связана с основным циклом. Этот цикл, по задумке, должен на каждой итерации просто смотреть, а есть ли в очереди что-то для него? если нет, то дальше исполняем, если есть то всё вычитываем. Основная программа, назовем её логика, а сообщения для неё - логическими. А есть еще сервисные сообщения, которые должны обрабатываться самим транспортом, это служебные сообщения. И вот, помимо логических сообщений, гоняются сервисные, которые вообще никак не связаны с логикой, и не должны зависеть от состояний логики, начала она новую итерацию или нет. Поэтому, мне показалось что класс транспорт очень хорошо должен лечь в поток. У транспорта, я предполагаю, будут две очереди: queueInput, queueOutput. Как только пришло сообщение, транспорт его прочитал, понял что тип сообщения - логический, кладёт его в queueInput. Логика в свою очередь, во время своей работы если надо отправить сообщений, кладёт своё логическое сообщение в queueOutput. И транспорт, периодически просматривая queueOutput забирает оттуда сообщение и отправляет в сеть. Клиентов вообще немного, но предполагается сообщения будут ходить постоянно. Если сервер не видит активности от клиента (передача каких либо сообщений), то посылает ему некое сервисное сообщения а-ля ты живой? Вот, это все мои рассуждения на данном этапе, и исходя из этого тред-пулл мне кажется здесь избыточен. Можно было бы делать всё на Qt, я бы не задумывался и делал сигнал-слоты и всё бы работало. Но нужен чистый c++11. И многого я еще не знаю, поэтому прошу сильно не ругаться. Кстати, большое спасибо за помощь. :-) На данный момент вообще, всё что я рассматриваю это Unix Domain Socket, но транспорт надо будет так же расширить до UDP. То есть сделать универсальный класс, который, как я вижу, в конечной программе надо создать объект этого класса, и не задумываться как он работает. Грубо говоря у класса-транспорта открыты 2 метода: просмотреть\вычитать очередь и положить в очередь. Парсинг есть, сообщения разбираются отлично. Вопрос вот только остаётся как организовать правильную паралельную работу транспорта и логики.
  • Как правильно организовать вечный цикл в отдельном потоке C++11?

    @Vorotislav Автор вопроса
    Дмитрий, вы копаете не в ту сторону. Я не говорил, что у меня еполл что-либо обрабатывает. Я говорил, что мой класс Транспорт содержит в себе механизм как еполл, так и обработки сообщений. Какой тред у меня блокируется? О чем вы говорите? Вопрос мой был совершенно про другое - как правильно организовать второй поток: засунув в поток весь объект класса или только функцию с вечным циклом? В первом случае, если объект класса будет в потоке, смогу ли я дёргать открытые функции объекта? P.S. не заметил особой разницы в трудозатратах между select и epoll.
  • Как правильно организовать вечный цикл в отдельном потоке C++11?

    @Vorotislav Автор вопроса
    Не могу я взять Asio, есть определенные ограничения. Епол был реализован совсем не давно, и при этом в самом начале я столкнулся с такой проблемой, что если поставить для таймаута еполлу -1 - тогда в основной программе вечный цикл блокируется и ждет. И моя задача, разделить основной цикл программы от еполла. Собственно ради этого всё и делается сейчас, чтобы еполл мог работать сам по себе: ждать пару типов сообщений, один тип должен обрабатывать сам, другой тип должен каким-то образом передать основной программе.
  • Qt. Возможно ли создание динамической сборки контекстного меню?

    @Vorotislav Автор вопроса
    Спасибо. На QML еще не перешел, все на виджетах.
  • Как получить доступ к файловой системе устройства?

    @Vorotislav Автор вопроса
    Судя по всему, Вы правы. Через CLSID можно получить доступ, но командная строка не знает что это такое. Попытался обмануть всех и подключить как сетевой диск - нельзя. А при открытии любого файла с телефона, он копируется в длинный путь в профиле.
  • Как получить доступ к файловой системе устройства?

    @Vorotislav Автор вопроса
    С устройства не пробовал, но попробовал с телефона (они схожи в поведении, так же нет буквы и т.д.), нельзя оттуда файл перетащить в cmd.
  • Как организовать передачу информации по сети в приложении Qt?

    @Vorotislav Автор вопроса
    Про каркас речь и идет.
    Даже в случае предложенного варианта, вопрос все равно открыт, как мне передать состояние комнаты в данный момент времени. Вот есть комната которая хранится в векторе агента vectorRoom.appent (new LivinRoom);
    В самой комнате есть вектор книг по такому же принципу создаются и хранятся. И предположим добавилась книга в какой то комнате. Как быть дальше?