Russian Qt Forum
Ноябрь 23, 2024, 07:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: QVector в QDataStream для передачи по сети! Помогите  (Прочитано 20181 раз)
lolbla2
Гость
« Ответ #30 : Февраль 07, 2012, 17:34 »

Цитировать

Я не то чтобы опытный, просто сеть на Qt уже полгода ковыряю и шишечек понабил уже себе. Учился большей частью сам по книжкам и примерам. Сейчас как раз место работы меняю чтоб на новом подучится у старших программировать правильно, а не индусокодить.


Кстати о шишках а вот одна из них!((( Теперь на другую проблему наткнулся когда игроков (5-6) и более клиентов, при отсылке данных сервер падает иногда, но не всегда хмм... видимо слишком много данных что ли, хотя шлю всего структуру
Код:
struct PlayerInfo
{
    int players;
    int myPlayerNum;
};

всем игрокам, это типо когда игру стартую отсылаю всем чтобы каждый знал какой он по счёту игрок и сколько игроков в игре ваще.

Когда сервер падает вылезает  Runtime error
Записан
Orfus
Гость
« Ответ #31 : Февраль 07, 2012, 17:44 »

собирай отладочную версию и запускай в режиме отладки.
Записан
lolbla2
Гость
« Ответ #32 : Февраль 07, 2012, 18:18 »

собирай отладочную версию и запускай в режиме отладки.

вообщем вот такая ошибка:



Сталкивался с такой?
Записан
Orfus
Гость
« Ответ #33 : Февраль 07, 2012, 19:21 »

собирай отладочную версию и запускай в режиме отладки.

вообщем вот такая ошибка:



Сталкивался с такой?

Ответ тот же.
собирай отладочную версию и запускай в режиме отладки.
Компилишь версию под названием отладка и запускаешь через кнопку F5 (по умолчанию в Qt Creator). 99% что ты что то напутал или не учел с размерами векторов.
Записан
lolbla2
Гость
« Ответ #34 : Февраль 07, 2012, 19:49 »


[/quote]
Компилишь версию под названием отладка и запускаешь через кнопку F5 (по умолчанию в Qt Creator). 99% что ты что то напутал или не учел с размерами векторов.
[/quote]

Хах... ты угадал. Исправил это. Дело в индексах было. Ну теперь логика игры страдает данные всё норм передаются но танки не правильно двигаются... Дальше дело за мной... Если какие опять непонятности будут напишу))
Записан
KrupaKarlo
Гость
« Ответ #35 : Февраль 08, 2012, 07:55 »



Цитировать
o rly?
Код:
#include <QtCore>
#include <QApplication>

struct promp{
    int val1;
    int val2;
    bool val3;
};
Q_DECLARE_METATYPE(promp)

int main(int argc,char** argv){
    QApplication app(argc,argv);

    qRegisterMetaType<promp>("promp");

    promp p1;
    p1.val1=1;
    p1.val2=10;
    p1.val3=false;
    QVariant v=qVariantFromValue(p1);

    QFile f("t.temp");
    f.open(QIODevice::WriteOnly);
    f.resize(0);
    QDataStream st(&f);
    st<<v;
    f.close();

    return 1;
}
UPD
выкидывает
Код:
QVariant::save: unable to save type 258.
Немножко гугла выдало необходимость делать qRegisterMetaTypeStreamOperators<MyClass>("MyClass"); и увы таки описывать работу с QDataStream в обязательном порядке.




Но мне всё это не нравится по одной причине. и QVector и QVariant жрут больше ресурсов, чем нужно для задачи.
Я бы пихал ручками
Код:
out<<p1.val1<<p1.val2<<p1.val3;
а вначале ценной части сообщения писал кол-во структур приходящих.

Я же говорил надо определить операторы <<  и >>, но я же не знал что их можно определить так просто с помощью  qRegisterMetaTypeStreamOperators<MyClass>("MyClass");

Кстати а для чего нужно
Код:
qRegisterMetaType<promp>("promp");
?
 Разве макрос
Код:
Q_DECLARE_METATYPE(promp)
не регистрирует тип для QVariant?
Возможно много ресурсов жрёт но писать out<<p1.val1<<p1.val2<<p1.val3; а у меня так как ты видел 11 полей в структуре слишком не читабельный код делает. Наверно, конечно, я неправильно подхожу к данной задаче, но мне пока бы сделать так чтобы работало вообще и не важно сколько ресурсов жрёт, об оптимальности подумаю позже. Особенно мне понравилась идея сделать передачу и приём данных в отдельном потоке. Может сделаю позже, а пока хочу чтобы вообще это хотя бы так работало.

P.S. Orfus я вижу ты опытный программист, респект xD. Где и как учился прогать ?)))

я когда тебе писал про Q_DECLARE_METATYPE думал ты в ассистант зайдешь. Там прямо черным по былому ссылка на qRegisterMetaType а прямо после qRegisterMetaType идет описание void qRegisterMetaTypeStreamOperators ( const char * typeName )
« Последнее редактирование: Февраль 08, 2012, 07:57 от KrupaKarlo » Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #36 : Февраль 08, 2012, 08:16 »

Нельзя сериализацию QVariant с нестандартным типом через QDataStream для передачи по сети использовать.
Цитата: Serializing Qt Data Types
QVariant   
The type of the data (quint32)
The null flag (qint8)
The data of the specified type
Ибо у вас нет никакой гарантии, что на обеих сторонах типу выдастся одинаковый id.
То есть может это и сработает, пока у вас 1 модуль с qRegisterMetaType, но полагаться на это нельзя.
Записан
lolbla2
Гость
« Ответ #37 : Февраль 08, 2012, 10:06 »



я когда тебе писал про Q_DECLARE_METATYPE думал ты в ассистант зайдешь. Там прямо черным по былому ссылка на qRegisterMetaType а прямо после qRegisterMetaType идет описание void qRegisterMetaTypeStreamOperators ( const char * typeName )

Ни разу не пользовался ассистантом...
Записан
_OLEGator_
Гость
« Ответ #38 : Февраль 08, 2012, 10:21 »

Ни разу не пользовался ассистантом...

это фейл
Записан
lolbla2
Гость
« Ответ #39 : Февраль 08, 2012, 11:57 »

Ни разу не пользовался ассистантом...

это фейл

ага, справку юзаю f1 или в иннете
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.128 секунд. Запросов: 23.