О трудностях жизни

June 12th, 2009 Begemot

Тяжела и не казисть,

жизнь простого программиста(с)

Чего только не приходится делать на работе. Первое нехорошее предчувствие подленько кольнуло меня когда я узнал что придется активно работать с видео, в принципе ничего особенного просто показывать его, но уже тогда я догадывался что хорошего будет мало. Дальше я узнал что еще надо будет писать movie maker (хотя тут основную часть писал не я) и Webcam manager.

  1. И понеслось сначало надо было написать грид видео плееров, один из которых настоящий, остальные  рисованные все это на wxScrolledWindow – cо скроллингом, переключением етс.
  2. Потом оказалось что один и тот-же wxMediaCtrl необходимо шарить между несколькими окнами, поддерживать 3 режима Fit to window, One to One  и FullScreen – куча работы по написанию,  и главное внедрению всего этого в чужую запутанную архитектуру  и тестингу.
  3. wxMediaCtrl использует АктивХ под винду, а у этого АтивХ есть свое собственное поведение которое зависит от бекенда (под винду два родных) и не доступно для регулирования с наружи, что разумеется не устраивало – пришлось грязным хаком подменять оконную процедуру плеера и вмешиватся в обработку событий.
  4. Под маком все было еще веселее – там с wxMediaCtrl вообще печально. Во-первых он принципиально не может отрисовывать под другими контролами – то есть если видео играет на wxScrolledWindow и мы скроллим его – то видео отрисовывается поверх всего что есть в нашей программе. Во-вторых, Quike Time самостоятельно реагирует на нажатия мыши – останавливается, запускается не уведомляя об этом нас, в результате наши контролы управления получаются в рассогласованном состоянии. Короче под маком пришлось писать свой video backend.
  5. А в планах еще портирование всего этого под линукс, написание movie maker’a под макос, кроссплатформенная работа с веб-камерами… и может быть даже это все буду делать я…

Эх пойти бы сейчас в пастухи…


SVN или стабильная версия, что выбрать?

May 28th, 2009 Begemot

Прежде чем устанавливать и собирать wxWidgets, неплохо бы решить что именно ставить:) Я всегда пользовался стабильными версиями – качал архив с исходниками и собирал их. После последней проблемы, когда в стабильной версии был сломан html, я задумался.

С одной стороны, стабильная оно конечно стабильная, скачал и радуйся. С другой стороны – яркий пример, на сайте уже несколько месяцев лежит версия с багом.  Конечно баг хоть и заметный, но все таки не критический и проявляется далеко не у всех. Ну все равно, баг есть, патч есть – а народу предлагают скачать все ту же версию…

В общем, выкачал себе версию из репозитория, скомпилил, собрал свой софт – вроде все ок. Если посмотреть в changelog то с момента выпуска 2.8.10 – коммитов довольно много.

Если кому интересно ссылки для wxWidgets 2.8.10:

Posted in Oбщее | Tags:
Comments Off on SVN или стабильная версия, что выбрать?


Осторожнее надо быть с обновлениями

May 25th, 2009 Begemot

Выпустил новую версию менеджера буфера обмена, за день до релиза, в тестовых целях (проверить как работает скроллинг на дереве) обновился до wxWidgets 2.8.10. Задумался с какой версией собирать публичный релиз, старой “проверенной” 2.8.9 или новой .10 в которой много чего, по идее исправлено и улучшено, но сам то я не тестировал. Решил не рисковать, потом подумал, а фигли там, полюбому 2.8.10 должна быть лучше.

Уже в последний момент, собрав инталляшку, заметил багу. В 2.8.10 сломали html у меня пополз абаут и нагскрин. Пропачил wxWidgets, собрал заново – ошибка исчезла, но осадочек остался. Теперь ни каких больших обновлений third-party перед релизом, только заранее и тестировать, тестировать, тестировать…


Scroll wxTreeCtrl – как скроллить ручками

May 21st, 2009 Begemot

Появилась задача, есть wxTreeCtrl с горизонтальной линейкой прокрутки, необходимо переодически скроллить ее в начало начал. В wxWidgets есть SetScrollPos(wxHORIZONTAL, 0); , но она делает только то что сдвигает скроллер у окна, но никак не его содержимое, в принципе об этом честно написано в документации

This function does not directly affect the contents of the window: it is up to the application to take note of scrollbar attributes and redraw contents accordingly.

Хотя есть люди которые утверждают, что у них работает именно так как хочется, а не так как в документации говорится:) Я даже обновился до 2.8.10, но не помогло. Зато помог самый просто способ,

::SendMessage((HWND)m_Tree->GetHWND(), WM_HSCROLL, SB_LEFT, 0);

Дойдем до альтернативных OS, будем думать.

А посмотрел код для скроллинга в самой бибилиотеке… толи что я чего-то не понимаю, то ли там хрень какая-то 🙁


delay loaded dll – не всегда полезна

April 30th, 2009 Begemot

Дополнение к посту про то как вылечить проблему с OpenCV и wxWidgets путем использования отложенной загрузки библиотек,  сегодня нарвался на странную багу падает код загрузки каскада, для face detection

m_nested_cascade = (CvHaarClassifierCascade*)cvLoad( (const char*)path_nested_cascade.ToUTF8(), 0, 0, 0);

Оказалось падает из за использования delay loaded для OpenCV библиотек – вот такие странные бывают ситуации, все вылечилось путем добавления в лист отложенной загрузки только /delayload:highgui110d.dll  – а вот остальные пришлось оттуда убрать.

Странными иногда способами удается найти причину ошибку

Posted in Программирование | Tags:
Comments Off on delay loaded dll – не всегда полезна


Иногда вещи не такие как кажутся, про SetFocus()

April 29th, 2009 Begemot

Как оказывается SetFocus(),  не всегда делает то что можно от него ожидать не читая для докумментацию:) Для wxWindow все ок:

This sets the window to receive keyboard input.

А вот для wxPanel ситуация совсем другая:

Overrides wxWindow::SetFocus. This method uses the (undocumented) mix-in class wxControlContainer which manages the focus and TAB logic for controls which usually have child controls. In practice, if you call this method and the control has at least one child window, the focus will be given to the child window.

А то что надо,  делает  SetFocusIgnoringChildren()

Незнание этого простого файла, украло у меня вчера почти полтора часа, когда я пытался сделать нормальное управление с клавиатуры, в весьма сложной и запутанной системе. Вернеее украло не у меня, а у работадателя, но тоже нехорошо. Так что читайте доки 🙂


Цыплят по осени считают

April 22nd, 2009 Begemot

Меня тут порадовали,  оказывается в  Google Summer of Code приняли все три проекта для wxWidget – File-System Changes Notification SupportwxAUI Enchancements и, возможно самое вкусное, wxWidgets Ribbon-bar component.

Впечатлиться будущим риббоном можно по ссылке.


OpenCV и wxWidgets лечим ошибку при запуске

April 16th, 2009 Begemot

На работе пришлось знакомится с OpenCV, в процессе прикручивания ее в проект на wxWidgets, возникла довольно неприятная  проблема. Как только начинаем пользовать функций из highgui – при старте программы выскакивает MessageBox с ошибкой “Cannot initialize OLE“, и на тулбаре появляется несколько дополнительных иконо – типа окна. 

Все проблема в том что OpenCV пытается самостоятельно инициализовать OLE механизм при инициализации библиотеки и это конфликтует с wxWidgets.  Этот баг описан в баг-трекерах и OpenCV и wxWidgets – но решения пока нет. Использовали последний официальный релиз, по слухам версия из SVN должна была помочь. Выкачал, собрал – не помогло. 

Спасла нас отложенная загрузка библиотек (delay loaded), это великая идея пришла в светлую голову T-rex’a, за что ему респект и уважуха. Все просто, тперь highgui.dll запускается и инициализируется позже чем wxWidgets и все счастливы. 

Как добавить delay loaded библиотеки в ручную и с использованием CMake

Вручную – свойства проекта -> Linker -> Input -> Delay Loaded DLLs

мы используем CMake – пришлось повозится, но в конечном итоге получилось через опции командной строки линкера

set(CMAKE_EXE_LINKER_FLAGS “/delayload:highgui110d.dll /delayload:cv110d.dll /delayload:cxcore110d.dll”)

p.s. забавно что за неделю до того как мне сказали на работе ковырять OpenCV я первый раз о ней услышал, в одном из читаемых блогов.

Posted in Программирование
Comments Off on OpenCV и wxWidgets лечим ошибку при запуске


Слушайте свою интуиции

March 30th, 2009 Begemot

Что отличает опытного разработчика от новичка? Правильно – хорошая интуиция 🙂

Только что ситуация на работе – надо написать сохранение проектов с которыми работает программа в базу данных. Как это все должно выглядеть обсудили еще в пятницу, начальник набросал табличку в которой все должно хранится. Я с утра сел – казалось бы куда проще – заимплементить дамп в бд, нескольких классов, учитывая что структура уже придумана и основной код сохранения в хмл написан.

Не работает, падает на pDB->PrepareStatement(…), убил 20 минут перепроверяя свои знания SQL, правильность написания полей и т.д. – все правильно, но не работает. Оказалось, что ему не нравится что одно из полей таблицы названо “Index”.  Не знаю в чем трабла в SQLite или в используемом враппере wxSqlite3, или еще в чем… но факт что падает на строке

st = pDB->PrepareStatement(_T(“INSERT INTO MMFrames (ProjectID, Index,  Type, Properties) VALUES (?, ?, ?, ?);”));

Пришлось переименовывать поле в таблице.

А весь юмор ситуации в том что, когда создавал бд – я подумал что лучше вместо Index назвать поле Position. Но решил что раз начальник написал Index, пусть так и будет. Потом подумал, что это поле вообще тут не нужно и хотел его удалить, но опять же решил оставить, раз на бумажке есть. Вообщем доверяйте своей интуиции.


Вгрызаемся поглубже в окна

March 25th, 2009 Begemot

Продолжаю, вернее заканчиваю выкладывать перевод начала 4 главы сделанный Андреем Лизуновым. Начало про основы работы с окнами в wxWidgets здесь

Read the rest of this entry »

Posted in Учебники | Tags:
Comments Off on Вгрызаемся поглубже в окна