понедельник, 2 ноября 2009 г.

Visual Studio F1 Help Shortcut


Наиболее раздражающая вещь в Visual Studio для меня - это случайно нажать вместо Escape клавишу F1. При этом появляется окно "Help Update In Progress", которое блокирует основное окно на несколько минут.


Погуглив несколько минут, я нашел решение - это отключить клавишу F1 как таковую.

Жить стало легче (:

суббота, 31 октября 2009 г.

Параллельный LINQ

Многоядерные и многопроцессорные системы уже ни для кого не являются новостью, так как прогресс никогда не стоит на месте. В данном посте я хочу немного рассказать про набор расширений Parallel FX, а конкретно про PLINQ - механизм выполнения LINQ запросов на многоядерных системах. Отличия  с точки зрения синтаксиса в LINQ и PLINQ минимальны, все что требуется от программиста - это обвернуть источник данных в IParallelEnumerable<T> с помощью расширения System.Linq.ParallelEnumerable.AsParallel. К примеру возьмем запрос:

var T = Dat.Where(x => x.Value == 5).Select(x => x);

для его распараллеливания следует внести следующие изменения:

 var T = Dat.AsParallel().Where(x => x.Value == 5).Select(x => x);

Или же:

var T = from A in Dat.AsParallel() where A.Value == 5 select A;

Все! При выполнении запроса PLINQ сам организует запуск его частей на доступных процессорах.
Прелесть этой системы состоит в том, что от программиста вообще не требуется  никаких знаний параллельного программирования, а затраты на ее внедрение - минимальны.

Ссылки:
http://en.wikipedia.org/wiki/Parallel_Extensions
http://msdn.microsoft.com/ru-ru/magazine/cc163329.aspx

среда, 28 октября 2009 г.

IntelliTrace & Reverse Debugging в VS2010

Совсем недавно я писал про весьма удобную фишку VS2005/VS2008 - Tracepoints. В VS2010 пошли дальше и добавили - IntelliTrace (ранее известен как Historical Debugger). IntelliTrace - это вариант отладки (к сожалению доступен только для управляемого кода), при котором, кроме стандартных опций отладчика Visual Studio, вы можете выполнить полную трассировку программы, то есть просмотреть все UI события, User gestures, обращения к файловой системе, сети, реестру, LINQ запросы и т. п., а также в каждой контрольной точке видеть значение локальных переменных, call stack и т. д.

















Два раза кликнув по нужной записи - можно перейти к соответствующему участку кода в программе.

Дальше - лучше. IntelliTrace позволяет выполнять отладку как вперед так и назад. По умолчанию эта опция выключена. Для ее включения нужно поставить переключатель "IntelliTrace events and call information".














После этого во время отладки, слева от окна редактора появляется специальная панель.


Return to Call site
Go to previous call
Step in
Go to next call
Go to live mode.



Как видим, процесс отладки в VS станет заметно удобнее для программиста.

Ссылки: http://blogs.msdn.com/habibh/archive/2009/09/21/coverage-of-the-visual-studio-2010-historical-debugger.aspx

понедельник, 26 октября 2009 г.

Unigine heaven benchmark (DX11)

Ребята из Unigine выпустили бенчмарк на DX11. В демке преимущественно демонстрируется одна из основных фич ДХ11 - аппаратная тесселяция. Вынужден признать - картинка меня впечатлила. Красиво).













 Вот список ключевых фич:
* Native support of OpenGL, DirectX 9, DirectX 10 and DirectX 11
* Comprehensive use of tessellation technology
* Advanced SSAO (screen-space ambient occlusion)
* Volumetric cumulonimbus clouds generated by a physically accurate algorithm
* Dynamic simulation of changing environment with high physical fidelity
* Interactive experience with fly/walk-through modes
* ATI Eyefinity support



 Ссылки  на источник:
http://unigine.com/press-releases/091022-heaven_benchmark/
http://binstream.livejournal.com/82398.html#cutid1

четверг, 22 октября 2009 г.

Visual Studio Tracepoints

В Visual Studio есть одна интересная функция, которую я раньше в упор не замечал.
Очень часто во время отладки или тестирования кода возникает потребность выводить на экран значения тех или иных переменных. Раньше эта проблема решалась добавлением в код соответствующих методов: printf, Log, MessageBox, Console.WriteLine и т.п. Оказывается все намного проще и удобнее. В VS, начиная с 2005, есть Tracepoints. Это своего рода аналог Breakpoint, который позволяет выводить какие либо сообщения в DebugOutput. Создается трейспоинт через меню правой кнопкой, Breakpoint -> Insert Tracepoint.


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

суббота, 16 мая 2009 г.

Вызов чисто виртуальной функции))

Ничто так не ограничивает полёт мысли программиста, как компилятор :)) Но как сказал один мой товарищ - если иметь фантазию - можно творить чудеса... Сегодня мне в аську колега в комманде кинул интересный код вызова чисто виртуальной фукнции:

void func(class A*);

class A
{
public:
A() {func(this);}
virtual void pure() = 0;
};

class B : public A
{
public:
virtual void pure() {}
};

void func(A* a)
{
a->pure();
}

int main()
{
B* b = new B();
}

понедельник, 6 апреля 2009 г.

Думал, что мир перевернулся...

Сидел на лекции, баловался.. В итоге вышло, что заработал данный кусок кода (но только в релиз варианте, дебаг перехватывает обращения к неициализированному поинтеру):

class A {
public:
int a;
bool b;
float c;
void debug() { printf("%i %s %f\r\n", a, b ? "true" : "false", c); }
};

int main() {
A * f; // <-- ??? f->a = 4;
f->b = true;
f->c = 4.5f;
f->debug();
return 0;
}

Дальше в лес, больше дров, мой товарищ решил совсем извратиться :))

float* f;
int i;
for (i = 0; i < 10000000; i++) {
*f = 6.0f;
printf("%f\n", *f);
}
Так работает, но после определенного числа итераций валится.

А след. кусок валится сразу (если int i обьявить в конструкции for).
float* f;
for (int i = 0; i < 10000000; i++) {
*f = 6.0f;
printf("%f\n", *f);
}

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