Глава 15.3 Инструменты Защитного Программирования (Defensive Programming)

January 28th, 2010 Begemot

Последнее время (с тех пор как я сам начал активно использовать assert, проверки и т.д. :)),  мне все чаще кажется, что использование подобных механизмов является одной из тех граней, которые отличают начинающего программиста от профессионала. Так что не стесняйтесь, активно используйте:)

Глава 15.3 Инструменты Защитного Программирования (Defensive Programming)

Read the rest of this entry »


Увековечен

January 27th, 2010 Begemot

Ну вот и мое имя внесено в анналы истории 🙂 Страна должна знать своих героев 🙂


Глава 15.2 Обнаружение утечек памяти и других ошибок

January 22nd, 2010 Begemot

Перевод медленно но движется. Выкладываю вторую часть 15 главы – про поиск утечек памяти используя возможности wxWidgets.

Если кто хочет помочь в переводе оставшихся глав – вы всегда можете  поучаствовать и внести свой вклад, мы будем рады 🙂 Вся информация собрана на странице посвященной переводу книги по wxWidgets. Так что дерзайте:) Только согласовывайте свои намеренья до начала перевода, что бы не работать зря…

Глава 15.2 Обнаружение утечек памяти и других ошибок

Read the rest of this entry »


Компиляция wxWidgets с командной строки в Visual Studio

January 12th, 2010 Begemot

Наконец-то жизнь заставила научится компилить wxWidgets с командной строки используя Visual Studio. Связано это с тем что активно ковыряюсь в библиотеке на предмет выпрямления того что не выпрямлено (об этом в следующий раз, когда остыну:). Итак, у меня получилось что-то типа этого:

rem devenv  [файл_решения | файл_проекта | любой_файл.рсш]  [переключатели]

rem Clean
rem devenv "E:\Const\wxWidgets-trunk\build\msw\wx_vc9.sln" /clean "Debug"
rem devenv "E:\Const\wxWidgets-trunk\build\msw\wx_vc9.sln" /clean "Release"
rem devenv "E:\Const\third-party\databaselayer\build\databaselayer.sln" /Clean "3 Static Unicode Debug Multilib Static" /project databaselayer_databaselayer_sqlite.vcproj
rem devenv "E:\Const\third-party\databaselayer\build\databaselayer.sln" /Clean "3 Static Unicode Release Multilib Static" /project databaselayer_databaselayer_sqlite.vcproj


rem Build
rem devenv "E:\Const\wxWidgets-trunk\build\msw\wx_vc9.sln" /build "Debug"
rem devenv "E:\Const\wxWidgets-trunk\build\msw\wx_vc9.sln" /build "Release"

rem Rebuild
devenv "E:\Const\wxWidgets-trunk\build\msw\wx_vc9.sln" /rebuild "Debug"
rem devenv "E:\Const\wxWidgets-trunk\build\msw\wx_vc9.sln" /rebuild "Release"

rem databaselayer
devenv "E:\Const\third-party\databaselayer\build\databaselayer.sln" /rebuild "3 Static Unicode Debug Multilib Static" /project databaselayer_databaselayer_sqlite.vcproj
rem devenv "E:\Const\third-party\databaselayer\build\databaselayer.sln" /rebuild "3 Static Unicode Release Multilib Static" /project databaselayer_databaselayer_sqlite.vcproj

pause

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


Я негодую, SetMinSize

December 23rd, 2009 Begemot

Заметил что после последнего апдейта транка, баг в программе – оказывается изменилась логика библиотеки. Я запоминаю и восстанавливаю при старте программы размеры главного окна, баг был в том, что после запуска не удавалось уменьшить размер окна – сделать его меньше чем оно было в прошлый раз. Оказалось wxFrame::Create(parent, id, _caption, pos, size, style); использует переданные size and pos для вызова SetMinSize(), там даже есть коммент

   // assume the user doesn’t want this window to shrink beneath its initial
    // size, this worked like this in wxWidgets 2.8 and before and generally
    // often makes sense for child windows (for top level ones it definitely
    // does not as the user should be able to resize the window)
    //
    // note that we can’t use IsTopLevel() from ctor

Хорошо хоть в той ревизии с которой я последний раз делал public release этого еще не было. Логика сего действия мне абсолютно непонятна…

В общем потихоньку переезжаю на тройку, тестирую, выгребаю несовместимости.

Posted in Использование | Tags: ,
Comments Off on Я негодую, SetMinSize


Облегчаем просмотр переменных в дебагере

December 23rd, 2009 Begemot

Надеюсь вы все читаете официальный wxBlog, даже не смотря на то что пишут туда редко и на английском. А если не читаете то вы сами себе злобные буратины. 🙂

Сегодня наткнулся там на полезнейшую информацию – от том как улучшить отображение wx типов в дебагере Visual Studio, в частности строк и многих других, теперь не обязательно “раскрывать” переменную в окне просмотра дебагера или во всплывающей подсказе, должно здорово экономить время. Подробнее Better display of wxTypes in MSVS debuggerBetter display of wxTypes in MSVS debugger.

Единственно что я этот код вставлял в самое начало секции [AutoExpand] так проще, не приходиться искать ее конец.

p.s А еще я знаю одну архиполезную фишку, я ее как раз сейчас тестирую, скоро расскажу 🙂


С иконками все хорошо :)

December 16th, 2009 Begemot

Я тут недавно обнаружил что MFC-визард создает неправильный код для работы с иконками и поэтому у меня в программе много лет была кривая иконка на самом видном месте. Решил проверить как дела в wxWidgets программах. Оказалось вариант

SetIcon

(wxICON(main)); // Give it an icon

Работает правильно – грузит как 32*32 так и 16*16 иконку из файла, так что можно не беспокоиться.

А возможность использовать png для меню\тулбаров – вообще просто супер.

Posted in Использование | Tags:
Comments Off on С иконками все хорошо :)


Фокусы с cfg, разбор полетов

December 13th, 2009 Begemot

Продолжая тему с потерей конфига. Кратко напомню суть проблемы – периодически при загрузки компа конфиг файлы программы – “плохие”. Либа выдает ошибку конвертации в юникод и данных нет. Как показали эксперименты, файл есть, примерно нужного размера но заполнен нулевыми символами (???). Причем конфига у меня два, первый открыт все время работы программы и закрывается при выходе\получении сообщения о выключении компа. Второй открывается локально при выходе\завершении и тут же закрывается. Проблема с обоими.

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

Версия Сергея:

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

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

 

Eсли просто выключать комп все ок.

Если инициировать процесс выключения (в обработчике я пишу в конфиг и удаляю его), и сразу же нажать рессет. То в 60% случаев – проблема проявляется. Причем устойчивое появление проблемы мне удалось наблюдать только если программа стоит в автозагрузке, если же нет – то вроде все ок (это мне вообще мозг ломает…).

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

Уже не знаю что и думать. Наверное буду писать систему дублирования 🙁


Иногда вещи не такие как ты думаешь

December 8th, 2009 Begemot

Как думаете что будет в str?

wxConfigBase * config = wxConfigBase::Get();

config->Write(_T("/Options/teeestg"), _T("-\\&-"));

wxString str = config->Read(_T("/Options/teeestg"), str);

неправильно, будет “-&-”. Тоже самое и при использовании % вместо &. Проблема оказывается в том что при чтении из конфига автоматически раскрываются переменные окружения.

if you have the following in your config file:

  # config file for my program
  UserData = $HOME/data

  # the following syntax is valud only under Windows
  UserData = %windir%\\data.dat
 

the call to config->Read("UserData") will return something like "/home/zeitlin/data" if you’re lucky enough to run a Linux system 😉

Although this feature is very useful, it may be annoying if you read a value which containts ‘$’ or ‘%’ symbols (% is used for environment variables expansion under Windows) which are not used for environment variable expansion. In this situation you may call SetExpandEnvVars(false) just before reading this value and SetExpandEnvVars(true) just after. Another solution would be to prefix the offending symbols with a backslash.

Чтобы это отключить, необходимо вызвать config->SetExpandEnvVars(false);

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

Думаете надуманная ситуация? Ничего подобного, баг нашел юзер у которого имя пользователя в винде начинается с $ и это вызвано корпоративными стандартами, в этом случае путь к файлам пользователя получается “C:\Documents and

Settings\$xxx\Application Data\xxx\” ну и сразу после установки, программа не может открыть базу данных…

Posted in Программирование | Tags:
Comments Off on Иногда вещи не такие как ты думаешь


Между делом попробовал wxWidgets под Ubuntu

December 7th, 2009 Begemot

Выпало тут 4 часа в течении которых можно было работать только на ноуте. А там у меня недавно установленная убунта 9.10 х64. Сначала немного побаловался, поразбирался с системой (я вроде доволен) потом решил попробовать вх.

Поставил svn, выкачал trunk из репозитория, вспомнил о том, что как компилировать wxWidgets на линуксе я уже писал, по этой же инструкции собрал библиотеку, собрал пару примеров – clipboard, auidemo – и представляете себе, работает! 🙂

Правда, есть и плохой ньюанс, поработав несколько часов в линуксе, всерьоз задумался а стоит ли туда лезть и портировать свои утилиты, энтузиазма немного поубавилось…