Рисование по сети...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Lazy_caT
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 12.09.2002 (Чт) 12:12
Откуда: Russia

Рисование по сети...

Сообщение Lazy_caT » 05.05.2004 (Ср) 16:56

Салют всем!!

Задумал я тут сделать для своего чада и его друзей прогу чат+рисовалка по сети...
Чат, с помощью, здешних завсегдатаев, я уже сделал, остаётся только сделать рисовалку, саму рисовалку-то я сделаю, нужно организовать передачу содержимого PictureBox'а по сети...
Сделал такую фигню, расшарил в сеть папку на полный доступ и с помощью SavePicture и таймера на интервал в 1 сек. сохраняю туда картинки... размер у PictureBox'а фиксированный - 1024х768... следовательно картинка получается около 3-х с гаком мег... да и во время обновления PictureBox'а происходит задержка, небольшая, но всё-таки... Похоже на постоянные подёргивания, т.к. во время сохранения и загрузки приложение ждёт завершения операции...

Так вот, хочу спросить знающих людей, может кто подскажет способ как это сохранение и загрузку картинки организовать в реальном времени?
Т.е. меня интересует как сделать так чтобы в одном клиенте рисуешь, и это художество сразу появляется PictureBox'е других клиентов...
Протокол используется UDP (так, на всякий случай)...
Вариант с прямой передачей координат и всех остальных мелочей я уже пробовал, впринципе получается, но из-за задержек в сети линии и кривые на рисунке получаются прерывистыми.... Да и если из буфера обмена картинку вставляешь, на других клиентах эта картинка не отображается....
Помогите, плз, советом.... Как и что делать, может какие свежие идеи на этот счёт есть?...

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 05.05.2004 (Ср) 21:54

Надо каким-то образом разработать алгоритм фиксации изменений типа того, что делает MS Word. Т.е. в каком-то файле фиксировать толко изменения, и его и передавать по сети. А на соответствующем компьютере проводить обновление картинки.

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 06.05.2004 (Чт) 4:31

Предлагаю .... простой но верный способ.. он же координатный ...
Просто как я понял теряются данные при передаче ...
(у мня такое было когда сапер не работал) выход я сделал такой
вот пример

[GP]15,24[RB]

[GP] - команда например GetPosition

Винсок читает всё и не обрабатывает пока не получит в конце [RB]. Я бы конечно реализовал TCP соединение ...

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

Если всёже оставлять нынешний вариант, то думаю единственное, что можно посоветовать - ограничить палитру и реализовать/использоваь конвертор BMP->GIF или BMP->JPG (до 200-300к можно получить размер)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

TEH3OP
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 12.12.2003 (Пт) 20:19
Откуда: Москва

Сообщение TEH3OP » 06.05.2004 (Чт) 9:19

Если содержимое пикчербоха везде одно и то же, значит заголовок тама тож одинаковый. Мож просто выделять и передавать по сетке строки растра (из пиктербоха), которые изменились.

Определить какие строки изменились можно по вертикальным габаритам нарисованного.

Дальше просто держи растр в памяти или в файле и обновляй из него пиктербох.

Lazy_caT
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 12.09.2002 (Чт) 12:12
Откуда: Russia

Сообщение Lazy_caT » 06.05.2004 (Чт) 12:03

TEH3OP писал(а):Если содержимое пикчербоха везде одно и то же, значит заголовок тама тож одинаковый. Мож просто выделять и передавать по сетке строки растра (из пиктербоха), которые изменились.

Определить какие строки изменились можно по вертикальным габаритам нарисованного.

Дальше просто держи растр в памяти или в файле и обновляй из него пиктербох.


Дык, тут ситуация такая чтобы PictureBox обновлялся в реальном времени каждые 0.5-1 секунду... а не после того как это нарисованое будет нарисовано... У меня идёт пересохранение картинки после события MouseUp... Хотя, хрен её знает, может так и лучше будет...

Lazy_caT
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 12.09.2002 (Чт) 12:12
Откуда: Russia

Сообщение Lazy_caT » 06.05.2004 (Чт) 12:04

Кстати, вот тут столкнулся с ещё одной ситуацией... при запуске второгоБ третьего клиентов они мне сообщают "Error №75 Path/File acces error", сам файл существует... Вполне возможно он монопольно используется программой которая его создала... Т.е. остальные клиенты его открыть не смогут... :(

TEH3OP
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 12.12.2003 (Пт) 20:19
Откуда: Москва

Сообщение TEH3OP » 06.05.2004 (Чт) 13:59

Lazy_caT писал(а):Дык, тут ситуация такая чтобы PictureBox обновлялся в реальном времени каждые 0.5-1 секунду... а не после того как это нарисованое будет нарисовано... У меня идёт пересохранение картинки после события MouseUp... Хотя, хрен её знает, может так и лучше будет...


Смотри, если у тя 1024/768 точек изображение, то при глубине цвета 16 bpp одна строка буит занимать 1024*16 = 16384 b, при скорости в 10 mb/s получается что передаваться всё это буит за 0.00002 сек. (если я не совсем тупой).
Короче, держи в памяти байтовый массив с пиксельными данными картинки, как только обновился массив с данными делай SetDIBitsToDevice. Файлы держать и обновлять, эт галима... ;-)
Останется только сделать, чтобы данные не обновлялись одновременно с нескольких мест, хотя и иэто возможно, если обновляются разные строки.

Одной секунды, должно хватить на несколько загрузок.

Tamahawk
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 03.02.2004 (Вт) 22:11

Сообщение Tamahawk » 06.05.2004 (Чт) 14:12

Даю хорошую ссылочку http://freevbcode.com/listcode.asp?Category=2
по ищи там

TEH3OP
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 12.12.2003 (Пт) 20:19
Откуда: Москва

дополнение к пред. мессаге.

Сообщение TEH3OP » 06.05.2004 (Чт) 14:12

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

Lazy_caT
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 12.09.2002 (Чт) 12:12
Откуда: Russia

Сообщение Lazy_caT » 06.05.2004 (Чт) 15:52

TEH3OP писал(а):Если содержимое пикчербоха везде одно и то же, значит заголовок тама тож одинаковый. Мож просто выделять и передавать по сетке строки растра (из пиктербоха), которые изменились.

Определить какие строки изменились можно по вертикальным габаритам нарисованного.

Дальше просто держи растр в памяти или в файле и обновляй из него пиктербох.


Попробовал... С помощью Get\SetPixel... Матрица 100 пикселей на 100 пикселей считывается около 5 сек... (Amd Athlon 900 + 320 RAM +WinXP) И где тут "в реальном времени"?
А ведь эту матрицу по сети передать нужно...
Не, нужно что-то другое придумать.... Хотя вариант неплохой.... для маленьких размеров...

GoGosha
Постоялец
Постоялец
 
Сообщения: 642
Зарегистрирован: 02.08.2002 (Пт) 9:14
Откуда: Russia

Сообщение GoGosha » 06.05.2004 (Чт) 18:33

Вот примерчик, если чего не понятно: мыль
Вложения
chat PRO net.rar
(363.65 Кб) Скачиваний: 40
http://poetry.mooo.com
http://poetry.myboard.info
«Человек есть нечто, что до́лжно превзойти» (Ф. Ницше)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, SemrushBot и гости: 28

    TopList  
cron