Страница: 1 | 2 | 3 | 4 |
|
Вопрос: IP camera +VB.NET
|
Добавлено: 24.01.11 02:54
|
|
Номер ответа: 31 Автор ответа: ВВВ
Вопросов: 1 Ответов: 16
|
Профиль | | #31
|
Добавлено: 28.01.11 22:01
|
EROS пишет:
криво и безграмотно..
ехал как-то по России, проезжал речку и населенный пункт с названием ВОБЛЯ.
это, наверное, чтобы число ответов в статистике увеличить? или просто у тебя принцип жизненный такой?
Ответить
|
Номер ответа: 35 Автор ответа: EROS
Вопросов: 58 Ответов: 4255
|
Профиль | | #35
|
Добавлено: 29.01.11 02:04
|
вместо вонючих слов взял бы да написал грамотно и не кривыми руками
я написал это еще 2 года назад, работает и по сей день, но после твоего словесного поноса дать тебе код - себя не уважать. Вместо того, чтобы спасибо сказать за то что тебя, дурачка, уму разуму научил и разложил все по полочкам ты тут еще гавном плюешься.
чтобы хоть какой-то результат был по этой теме
говнокод - это не результат. Это пример того, как НЕ НУЖНО делать. А мой коммент для того, чтоб новички понимали что перед ними говнокод,который юзать не следует..
И последнее в этой теме.. Тебе бы,криворукому, не в позу оскарбленного и униженного становиться, а попросить указать на ошибки. Хотя нет, лучше не надо... юзай свой говнокод дальше.
Ответить
|
Номер ответа: 39 Автор ответа: Artyom
Разработчик
Вопросов: 130 Ответов: 6602
|
Профиль | | #39
|
Добавлено: 29.01.11 04:02
|
Уровень моей грамотности был невысок, а после того как я был вынужден перейти на английские версии MS Office, не имеющие русской проверки орфографии, он катастрофически снизился, тем не менее, позволю себе сделать некоторые замечания.
1.
- Private Sub RunConnection(ByVal c_ip As String, ByVal c_port As Integer)
- .....
- RunConnection("192.168.2.178", "80")
Второй аргумент метода RunConnection имеет тип Integer, но при вызове этого метода в него передается объект типа String. Исходя из предположения, что автор убедился в том, что код компилируется, перед тем как его выкладывать, приходим к выводу что автор пишет проект с отключенной жесткой проверкой типов (Option Strict Off), что само по себе является эпическим фейлом.
2.
- Public Class c_cam
- Private c_socket As New Net.Sockets.TcpClient
- Dim c_autoreconnect As Boolean
- Const GetPath As String = "/videostream.cgi"
- Private Sub RunConnection(ByVal c_ip As String, ByVal c_port As Integer)
Из этой выдержки можно прийти к выводу, что автор для всех идентификаторов (кроме методов) использует одну и ту же нотацию, которая не используется в .NET. Что является эпическим фейлом.
3.
- Event Reconnection(ByVal form1 As Form1)
- Public Event FrameDropped(ByVal dropscount As Integer)
- Public Event Frame(ByVal f() As Byte)
Для событий автор использует сигнатуры, которые не используются в .NET. В .NET общепринятой является сигнатура
- Public Event FrameDropped(ByVal sender As Object, ByVal e As System.EventArgs)
В тех случаях, когда с событием связаны определенные данные, вместо System.EventArgs используется наследник System.EventArgs.
Тот факт, что автор не использует общепринятую сигнатуру, является эпическим фейлом.
4.
- Dim resp As New Net.Sockets.TcpClient()
Выбор TcpClient в данном случае необоснован. В данной ситуации более подходящим является класс HttpWebRequest
5.
- resp.Connect(c_ip, c_port)
- c_socket = resp
- Dim header As String = String.Format("GET" & vbNewLine & vbNewLine, c_ip, c_port, GetPath, Crypt("admin", "1234"))
- resp.Client.Send(Encoding.Default.GetBytes(header))
- Me.OnConnect()
Данный код выполняется в UI потоке. Следовательно, все время, которое будет выполняться подключение, форма висеть и не будет реагировать на действия пользователя.
Это может быть не заметно при тестировании локально, и очень хорошо будет заметно при запуске в инете.
6.
- Dim d(1024 * 900) As Byte
Выбор размера буфера ничем не обоснован.
В качестве промежуточного буфера при работе с IO рекомендуется выбирать 8 кб. В данном же случае EROS предлагал более подходящий вариант - использовать буфер, которого гарантированно хватит на несколько кадров (но поскольку нельзя быть на 100% увереным в том, что буфера будет хватать, нужно предусмотреть возможность его увеличения по ходу работу).
7.
- c_queuestrbuffer &= System.Text.Encoding.Default.GetString(d, 0, cnt)
Здесь нельзя использовать Encoding.Default, потому что в качестве Default кодировки может быть не только 8-битная, но и 7-битная, а также многобайтная. И ее использования для кодирование бинарных данных (jpeg) в текст и обратно приведет к порче данных.
8.
- Private c_queuestrbuffer As String = ""
- ...
- c_queuestrbuffer &= System.Text.Encoding.Default.GetString(d, 0, cnt)
- Dim p() As String = Split(c_queuestrbuffer, dev)
Использование строки в качестве буфера является очень грубой ошибкой.
Во-первых, очень часто будут выполняться операции конкатенации. Поскольку стркои являются неизменяемыми объектами, любая такая операция будет сопровождаться созданием нового объекта типа String, что приведет к бОльшему расходу памяти и, как следствие, более частому запуску сборщика мусора. Более того, в определенных случаях CLR может выбрать неудачный размер нулевого поколения. Это приведет к тому, что эти потеряные строки быстро попадут во 2-е поколение, которое не начнет очищаться до тех пор, пока не кончится свободная оперативная память.
Во-вторых, так же часто выполняется операция Spit, результатом работы которой является еще большее кол-во объектов, что приводит к аналогичным последствиям.
Учитывая, что при решении этой задачи есть возможность ограничиться одним буфером на несколько десятков кб, использоваться строки является эпическим фейлом.
9.
Не знаком с протоколом, однако могу предположить, что здесь должно быть > 1.
10.
- c_queuestrbuffer = dev & p(p.Length - 1)
Здесь не учитывается, что за один раз из потока может быть считано больше одного кадра. В этом случае все кадры, кроме последнего пришедшего будут утеряны и не будту обработаны.
11.
- Private c_queuestrbuffer As String = ""
Строковый буфер объявлен на уровне класса, хотя это излишне и его достаточно объявить в методе. Из-за этого, при повторном запуске метода ReciveData в этом буфере может оказаться мусор, оставшийся после предыдущего запуска, поскольку перед началом работы буфер не обнуляется.
12.
- Dim m As New IO.MemoryStream(System.Text.Encoding.Default.GetBytes(c_lf))
Идет работа с Stream, почему не вижу Using?
13.
Обращение к контролу не из UI потока (см Control.Invoke). эпик фейл.
14.
Бесполезный счетчик, нигде не используется.
15.
Методом Tread.Abort допустимо использовать, когда поток должен убить сам себя. В противных случаях это может привести к непредвиденным последствиям (подробнее в MSDN в комментариях к этому методу, там расписано, в т.ч. много матана).
Кроме того
16. Практически отсутствует обработка ошибок (например, могут прийти поврежденные данные, и тогда Bitmap.FromStream даст исключение)
17. Никакой политики работы с неуправляемыми ресурсами (таковыми является TcpClient, Bitmap (которые уже стали ненужными)), что может привести к утечкам памяти и другим проблемам (если у камеры ограничено макс. число одновременных подключений, то код вполне может все их занять, при этом ничего не показывая)
18. Нет понятия о таймаутах. Если камера зависнет, код тоже зависнет на неопределенное время и никак не обработает эту ситуацию.
Это что на поверхности, глубоко не вникал, нет времени.
Ответить
|
Номер ответа: 42 Автор ответа: EROS
Вопросов: 58 Ответов: 4255
|
Профиль | | #42
|
Добавлено: 29.01.11 16:32
|
Igory Rubas действительно родился в 1961 году? 50 лет?
И что, возраст дает право хамить и оперировать выражениями типа:
вместо вонючих слов, останется вонь от твоих комментов, а дерьма в тебе точно много и т.д.
моя реакиця была ответом на хамство..
И то, что он там
нормальные вещи мутит
не отменяет тот факт, что как программист он безграмотный и криворукий.
Кроме того,если бы ему на самом деле было бы 50 лет, то он был бы способен достойно принять обоснованную критику в свой адрес.
Ответить
|
Номер ответа: 43 Автор ответа: ВВВ
Вопросов: 1 Ответов: 16
|
Профиль | | #43
|
Добавлено: 29.01.11 17:29
|
ребята, давайте жить дружно форум не для того, чтобы считающие себя умными и пряморукими поливали все вокруг(посмотрите ради прикола комменты того чЛЕНА этого форума - ламеры и т.д.. ).
Опубликовал тот кусок кода не для получения лесного отзыва от кого-нибудь (мне фиолетово чье-то мнение уже давно), а для того, чтобы хоть кому-то пригодилось, как можно с IP-камеры поток посмотреть.
БОльшая часть кода вообще выдрана с попавшегося неработающего примера с инета (http://tugibaev.ru/?p=71), маркера начала/конца кадра в нем тоже не было.
Я свою задачу решил, а насчет хамства отдельных личностей .. достаточно часто на форумах встречаются "крутые" только в виртуальном пространстве особи, надувающие щеки и морщащие свой лобок от собственной важности, благодаря чувству безнаказанности - к сожалению, я сам не сдержался от реакции на его коммент , чем отличается критика от того ..., всем остальным, уверен-понятно.
Вся эта словесная перепалка - соверщенно глупое занятие, на которое соверщенно не стоит тратить время и внимание ни чужое(в данном случае-внимание форумчан), ни тем более -свое. Насчет криворукости - посмотри свои произведения, написанные немного раньше - заметишь очень много криворукого . и это есть нормально, значит есть какое-то развитие . у меня, в основном -прикладные задачи, которые успешно работают. Первую прогу(за которую получил деньги) написал в 1982 г - на Fortranе, машинки были тогда Д3-28, оптимизация параметров гидроаккустической антены глубиномера подводного объекта.
а цель этого топика - согласитесь не в этом.
Ответить
|
Страница: 1 | 2 | 3 | 4 |
Поиск по форуму