• QT offscreen dialog?

    maaGames
    @maaGames Автор вопроса
    Я только начал изучать QT, пока плохо понимаю его :)
    widget - объект диалога? При создании диалогового окна нужно какой-то стиль задавть, чтобы окно было невидимым, но обрабатывало события? Т.е. если я не вызову метод show, то диалог в принципе не создастся, а если вызову, то диалог будет видимым.
  • ПК с оперативной памятью в двух канале выдает BSOD, как это возможно?

    maaGames
    @maaGames
    Виталий Малий, Судя по WIN8_DRIVER_FAULT нужно попробовать загрузиться в безопасном режиме, снести все драйвера (в первую очередь на видяху и звук) и поставить их заново после перезагрузки. И БИОС прошить свежий, если есть.
  • Как передавать много сообщений через Socket?

    maaGames
    @maaGames Автор вопроса
    tsarevfs, Добавил чтение всех объектов внутри poll, всё сразу заработало, как планиорвалось.
    Только вместо rdbuf->in_avail нужно использовать sis.eof(). in_avail, похоже, буферизирует число байт сразу после poll и не уменьшает значение (или как-то не очевидно там значение меняется, в общем падает чтение). А c eof отработало всё нормально.
  • Как передавать много сообщений через Socket?

    maaGames
    @maaGames Автор вопроса
    Евгений Шатунов, Меня ввело в заблуждение использование класса SocketInput/OutputStream. Я ожидал, что закрытие outputStream гарантированно прервёт данные в сокете и poll вернёт только их этого объекта массив байт. Т.е. ожидал от обёртки намного больше, чем она реально предоставляет.
    Буду после poll вычитывать все байты, которые там есть, даже если больше одного объекта прилетело (с блокировкой сокета на чтение, если не весь массив байт уже загружен).
  • Как передавать много сообщений через Socket?

    maaGames
    @maaGames Автор вопроса
    tsarevfs, Да, нет никакого смысла создавать каждый раз inputstream, я ожидал другого поведения, поэтмоу создавал. Раз всё-равно нужно объём переданных данных самому контролировать, то можно одновременно с сокетом его создать один раз и всё.
  • Как передавать много сообщений через Socket?

    maaGames
    @maaGames Автор вопроса
    tsarevfs, Под словом "сообщение" я подразумевал бинарные данные. Т.е. именно текста там нет в принципе. В логах будет только время, человеко-дружелюбный идентификатор и размер блока байт...
    Спасибо за подскзки. Надеюсь, я правильно понял причину проблемы и смогу починить.
  • Как передавать много сообщений через Socket?

    maaGames
    @maaGames Автор вопроса
    Евгений Шатунов, Если документация не врёт, то TCP. UDP испльзовать мне рановато и задержки не принципиальны.
    Потом планирую маленькие сообщения сделать в ICMP, вроде как раз для малюток в несколько байт они и предназначены. Но пока нужно заставить всё корректно работать в TCP, оптимизация подождёт.
  • Как передавать много сообщений через Socket?

    maaGames
    @maaGames Автор вопроса
    tsarevfs, Думаю, у меня проблема именно когда в poll больше 1 объекта успевает прилететь. Ведь если после срабатывания poll я считаю из сокета не все данные, то при следующем срабатывании poll те недочитанные данные потеряются? По поведению похоже, что именно это происходит. Попробую что-то типа такого (сейчас у меня есть только while-poll, без внутреннего do-while):
    while(true)
    {
      if( poll )
      {
           do
            {
                SocketInputStream sis(...);
                int size;
                sis.read( &size, 4 );
    
                byte * data = byte[size];
                sis.read( data, .size );
            }
            while( !sis.eof() );
      }
    }
  • Как передавать много сообщений через Socket?

    maaGames
    @maaGames Автор вопроса
    Евгений Шатунов, Да, у меня была мысль, что между разными write "кто-то как-то" вклинивается, не смотря на мьютекс. Поэтому я подправил обёртку класса, чтобы не сразу в сокет писалось, а чтобы все данные собирались в strstream, а потом эту строку одним write записываю в сокет. Причём, в первых 4 байтах строки записан её размер в байтах (перед записью в сокет в начало строки её размер записываю). Но это не помогло. Как мне уже подсказали, в poll может быть накоплено больше одного сообщения и они могут быть та мне полностью. Видимо с этим и связаны мои проблемы, что часть данных теряется. Надо перепроектировать чтение.
  • Как передавать много сообщений через Socket?

    maaGames
    @maaGames Автор вопроса
    tsarevfs, Видимо, если в poll пришло больше 1 сообщения, то все данные, которые не относились к первому сообщению - теряются. И при последующем срабатывании poll я уже пытаюсь работать с неправильными данными, потому что старый "хвост" потерялся.

    Видимо, после poll и чтения первого объекта нужно не заново запускать poll, а проверять, достигнут ли eof в потоке? Или как правильно проверить, что данных в сокете не осталось?
  • Как передавать много сообщений через Socket?

    maaGames
    @maaGames Автор вопроса
    tsarevfs, Самостоятельно не поддерживаю. Разве классы-обёртки SocketInputStream не реализуют как раз функционал "поддержки"? В тестовом примере я передавал std::vector на сотню мегабайт, он "самостоятельно" разбился на куски разных размеров и на сервере из этих кусков собрался обратно. Т.е. я в кленте написал: отправить 4 байта с размером массива, отправить N байт самого массива. А на сервере после срабатывания poll написал: считать 4 байта размера, vector.resize(N), считать N байт в массив. Т.е. ни циклических буферов, ни чего подобного самостоятельно не реализовывал, все фрагменты подтянул SocketInputStream.
  • Как передавать много сообщений через Socket?

    maaGames
    @maaGames Автор вопроса
    Евгений Шатунов, > Или блокировать сокет на период записи пакета от прочих попыток записи.

    Если я правильно разобрался с библиотекой, там по умолчанию создаются блокируемые сокеты, а не блокируемые нужно созавать отдельным методом или вызывать функцию, чтобы сделать сокеты не блокируемыми. Т.е., пока не закончится запись в сокет, другой поток в этот сокет писать не сможет (плюс у меня функция записи обёрнута в мьютекс, чтобы уж наверняка - если это лишнее, потом удалю).
    Но, если я правильно понял, отправиться может как бльше, так и меньше байт, чем я пытаюсь передать. И я не понял, от чего это зависит и что мне с этим делать.
  • Как передавать много сообщений через Socket?

    maaGames
    @maaGames Автор вопроса
    tsarevfs Про логирование - спасибо. А можете что-то посоветовать для сравнения двух файлов по тайм кодам? Просто глазами два файла с тысячами строк смотреть и сихронизировать их по времени - немного неприятно.
  • Как передавать много сообщений через Socket?

    maaGames
    @maaGames Автор вопроса
    Код показать не могу, к сожалению :(

    Мне нужно как-то узнавать, что пришло новое сообщение (или событие, не знаю, какая терминология правильная), получать его идентификатор и, в зависимости от этого, считывать различный объём байт.
    Условно, отправляю три сообщения (идентификатор + данные):
    версия+номер ,
    название+текст ,
    тип_объекта+массив_байт_этого_объекта

    И на сервере я слушаю порт методом poll(), когда что-то прилетает, я считываю 4 байта идентификатора и в зависимости от него считываю различный объём байт. Размер считываемых байт в начале каждого блока данных записан, т.е. я знаю, сколько байт нужн осчитать.
    Вернее, после срабатывания poll я создаю SocketInputStream передавая тот же сокет, который ждал poll и уже из этого объекта считываю идентификатор и данные. И в итоге у меня получается, что объект SocketInputStream начинает считывать данные "со смещением", если можно так выразиться, в начале должно быть магическое число, но по факту там находятся данные предыдущего или следующего сообщения (сложно понять, тех или тех, но точно не случайный мусор).

    По идее, мутекс анлочится после fush. Но у меня нет уверенности, что сокет будет пересылать данные сразу при этом, а не будет ждать заполнения буфера до 1024 байт (по умолчанию там такой буфер указан) и/или закрытия сокета.
    {
        ScopeMutex mutex( mutex_object );
        SocketOutputStream sos(...);
        sos.write(...);
    }
  • Как передавать много сообщений через Socket?

    maaGames
    @maaGames Автор вопроса
    Race condition быть не может, потому что мьютекс не даёт. Т.е. до создания объекта SocketOutputStream ждётся анлок мьютекса. Анлок происходит после удаления SocketOutputStream. Но если где-то после этого уже возникает гонка (уже после вызовов write и удаления объекта поока), то я даже не представляю, как с этим бороться тогда...

    SocketOutputStream использую как раз для того, чтобы самому не управлять буфером. При одиночных запросах сотни мегабайт передаются без проблем, так что не должно быть в размере буфера проблем. Но это не точно, я только начинаю с Poco разбираться.

    Обмен данными происходит на одном ПК, либо между компьютерами в локальной сети. Такой же объём данных без проблем передавался через очередь сообщений Windows (но большие данные передавались через файл), так что проблем с DoS быть не должно.

    Часто и много передаются только маленькие сообщения, их может быть несколько тысяч за несколько секунд, размером порядка десятков байт, но это включая "магические числа" для проверки правильности данных. Потом можно будет заняться оптимизацией размера, если потребность будет. Сейчас вопрос производительности и загрузки сети не сильно волнует.
  • Постфиксная запись на stack?

    maaGames
    @maaGames
    Данил, Кстати, да. Сайдэффектов лучше избегать. и оптипизирующий компилятор может сильно наоптимизирвоать не очевидных вещей (особенно когда перегрузка операторов испоьзуется, тогда вообще поведение становится не очевидным).
  • Можно ли в Google Play не показывать полный, реальный адрес, если продаешь приложение?

    maaGames
    @maaGames
    Kraken115, Кошелёк не при регистрации, это я немного ошибся. Если будешь AdSense подключать, то вот там нужно будет подтвердить личность при помощи пин-кода в бумажном письме. Я выводил деньги только с рекламы, с внутриировых покупок не выводил, так что не знаю, будут ли там какие-то дополнительные подтверждения. По идее, должны быть, т.к. Гугл за тебя выплачивает налоги (если я правильно помню условия пользовательского соглашения).
  • Почему работает разыменование пустого объекта?

    maaGames
    @maaGames
    Pashka23, Тем более! Само по себе название переменной намекает. В таких ситуациях говоришь: "в первую очередь инициализируем указатель нулём, а теперь давайте смотреть дальше..."
  • Может ли быть два базовых случая в рекурсии?

    maaGames
    @maaGames
    Ventus, В рекурсии есть условие выхода из рекурсии, видимо его подразумевали под "базовым случаем". Но это именно условие завершения рекурсии и этих условий может быть хоть сколько, но как минимум одно условие есть всегда, иначе получится "вечная" рекурсия, которая съест весь стэк и приложение упадёт :)
  • Какой спрайт лучше подобрать под временное закрытие прохода?

    maaGames
    @maaGames
    Одиночка Айс, Как я понял, автору не нужна бесшовная загрузка и он делает аналог "зашёл в комнату, закрылась дверь, прогрузился следующий уровень, открылась дверь в новую локацию", как это делалось в почти всех играх до недавнего времени. Так что в любом случае есть "точки склейки" локаций. Деалешь локации разделёнными чем-нибудь, чтобы были конкретные места соединения и пихаешь туда разводные мосты, открывающиеся проходы в скалах, пролетающее облачко, по которому можно перебраться на другую сторону, и т.д т.п.
    Бесшовную склейку тоже можно сделать "малой кровью", если между большими локациями содавать небольшие "склеивающие локации". Тогда в памяти нужно держать локацию, в которой находится игрок и все смежные с ней (или не все, а только те, к которым игрок ближе; локация не обязана быть четырёхугольной, смежных может быть хоть 20 штук). Переходишь в минилокацию - подгружаешь смежную мини-локацию. Переходишь в смежную мини-локацию, выгружаешь старую большую и загружаешь новую большую. Переходишь в новую большую и удаляешь старую мини-локацию. Но это я говорю о локациях типа 1000*1000 ячеек. Для 25*25 можно обойтись без мини-смежных и просто грузить соседние.