LINUX.ORG.RU

DataModel over TCP/IP

 qnetworkdatamodel,


2

3

Последние несколько недель наслаждаюсь Model/View framework из состава Qt.

Там есть все: и доступ к sql-базам данных, и просто создние своих model, и QDataWidgetMapper (позволяет легко создать свой виджет для удобного редактирования конкретного элемента модели), и QProxyModel + QSortFilterProxyModel (позволяют фильтровать данные для view не меняя данных в основной модели), и QSelectionItemModel (позволяет «расшарить» выбор элементов между View). Все круто. Определенно стоит создать цикл статей, который бы подробно описывал использование этого мощного интсрумента, хотя и в официальной документации вопрос раскрыт на должном уровне.

Но тред не совсем об этом. Во всей этой куче приятностей явно не хватает одной очень важной вещи.

Я говорю о QNetworkDataModel и QNetworkView. Можете не искать документацию об этих классах - их не существует. Но они могли бы существовать и выполнять возможность «проброса» данных из модели по сети (TCP/IP). Такие классы помогли бы упростить создание трехзвенных клиентов для баз данных, принесли бы пользу и в других сетевых приложениях, которые используют сеть для передачи данных.

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

★★★★★

Последнее исправление: trex6 (всего исправлений: 3)
Ответ на: комментарий от staseg

writeData

виноват, хотел сказать write

Жор ядра на 100%, забита треть стомегабитного канала.

т.е. проц занят был на 100%, а канал только на треть, при этом буст канал полностью обслужил ?

x905 ★★★★★
()
Ответ на: комментарий от x905

И boost, и POSIX-сокеты свободно зафлуживают канал, процессор почти все время спит. Небольшие вариации нагрузки процессора возникают в зависимости от размера датаграмы, но это уже оффтоп.

Я привел пример с UDP-флудом, потому что проблема вставала на практике, коллеги написали флудер для тестирования железки, который работал очень медленно. Гениальный техдир, помешанный на FPGA, тогда смаху решил, что современные CPU не умеют использовать весь потенциал Ethernet-сетей и чуть было не начал проект аппаратной флудилки :) И это тоже оффтоп.

PS. Я сходу не понял как write-ом писать в QUdpSocket.

staseg ★★★★★
()
Последнее исправление: staseg (всего исправлений: 3)
Ответ на: комментарий от staseg

PS. Я сходу не понял как write-ом писать в QUdpSocket.

не придирайся к словам (да тут writeDatagram)

и все же без приведения кода утверждение, что qt гавно, не есть показатель грамотности специалиста

x905 ★★★★★
()
Ответ на: комментарий от x905

не придирайся к словам

Я не придираюсь, а пытаюсь понять какой из write-ов ты имеешь в виду. Ок, writeDatagram.

и все же без приведения кода утверждение, что qt гавно, не есть показатель грамотности специалиста

Qt не говно, сетка в нем говно. Пробуй раскочегарить:

#include<QUdpSocket>

int main(){
 QUdpSocket socket;
 QHostAddress addr("192.168.137.4");
 for(;;)
  socket.writeDatagram("Hello",6,addr,1234);
 return 0;}

staseg ★★★★★
()
Ответ на: комментарий от x905

Отпишитесь в паблик, плз.

trex6 ★★★★★
() автор топика
Ответ на: комментарий от trex6

Я не писал что возможность отпадает, я писал про прозрачную возможность имея ввиду датастрим. (Что стандарт вроде для куте сериализации). Возможность не отпадает, но танцы с бубнами останутся.

zJes ★★
()
Ответ на: комментарий от x905

итак: локалка, между хостами 2 хаба (типа dlink), 100 мбит; на приеме:

на размере полезных данных 6 байт - по скорости примерно одинаково: ~22000 kbs/ 45000 pps (cpu 13% у сокетов, у qt 100%)
скорость в iptraf, сильно скачет - от 16000 до 22000 (иногда 23000,24000)

на размере полезных данных 600 байт - по скорости также примерно одинаково: ~96400 kbs/ 18770 pps (cpu 13% у сокетов, у qt 100%)
скорость в iptraf, стоит _стабильно_

т.е. упираемся в pps на мелком пакете

надо в отдельный поток у qt переделать

x905 ★★★★★
()
Ответ на: комментарий от zJes

О том, какой протокол будет использоваться для взаимодействия на уровне выше, чем передача байт я вообще ничего не писал. Вы делаете преждевременные выводы.

trex6 ★★★★★
() автор топика
Ответ на: комментарий от x905

В потоке sendto уменьшил потребление до 2-3%, QUdpSocket пока не поддается (надо покопаться в исходниках более плотно)

x905 ★★★★★
()
Ответ на: комментарий от staseg

qt создает неблокирующий сокет, перевел в блокирующей - стали аналогично работать оба способа

x905 ★★★★★
()
Ответ на: комментарий от staseg

блокирующий спит в ядре, когда не может отправить
неблокирующий постоянно возврат делает с кодом ошибки EAGAIN, а тут мы его циклом

x905 ★★★★★
()
Ответ на: комментарий от x905

Понятно, в случае полного забивания канала, логично - не спим, а долбим цикл. На каком CPU ты тестировал? У меня на работе Core2 Duo, что-то в районе 2Ггц, и канал забивается только на треть, от силы на половину.

staseg ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.