вторник, 25 ноября 2008 г.

Windows Vista Bridge Sample Library

На TheVista.ru опубликовали интересную статью про Windows Vista Bridge Sample Library. Цитирую:
Windows Vista Bridge Sample Library (VBSL) является развитием одной из идей команды Microsoft SDK по созданию своеобразного моста между .NET framework и Windows API. VBSL является библиотекой классов, которая облегчает разработчикам управляемого кода доступ к наиболее важным функциям Windows Vista без необходимости заботиться об уровне взаимодействия. Vista Bridge 1.3 предлагает разработчикам набор классов, библиотек и примеров, написанных на .NET, которые позволяют разработчику использовать такие функции Vista, как UAC, Power Management, Restart & Recovery, Restart Manager, Network, Aero Glass и многие другие. Необходимо отметить, что управляемые библиотеки Vista Bridge 1.3 отлично работают и с Windows 7 API и будут работать в будущих релизах по мере того, как команда SDK будет продолжать поддержку данного проекта.
В частности, можно легко получить стандартные вистовские диалоговые окна, например такие:





четверг, 20 ноября 2008 г.

Некоторые популярные запросы в гугле :)

Вот тут еще много :) 

Для примера:

суббота, 15 ноября 2008 г.

Работа с потоками

Что делать, если хочется оптимизировать программу научив ее работать с несколькими потоками, а стандартный BackgroundWorker помочь не может (как минимум потому, что создает только 1 поток)? Например, если хочется распараллелить цикл на максимально-доступное количество потоков в соответствии с текущим процессором?

Можно это сделать разными сложными путями, например, используя класс Thread. А можно пойти простым путем. Вот про него-то я и расскажу ниже.

Существует такой замечательный класс - ThreadPool. Во-первых, он умеет запускать именно столько потоков, сколько можно на текущей машине, а остальные ставит в очередь. А во-вторых, он позволяет просто решить проблему с ожиданием окончания работы запущенных потоков.

Добавить новый поток в очередь очень просто:
ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandle);
где метод DoTask:
void DoTask(Object state)
причем параметр waitHandle передается как Object state, но об этом попозже.

Дождаться завершения работы всех потоков можно вот так (на самом деле там куча вариантов - читайте документацию):

WaitHandle[] waitHandles = new WaitHandle[] { waitHandle };
WaitHandle.WaitAll(waitHandles);
Самое замечательное, что можно дожидаться завершения любого из потоков:


WaitHandle[] waitHandles = new WaitHandle[] { waitHandle };
WaitHandle.WaitAny(waitHandles);
Ну и последнее - про переменную waitHandle. Если ее проинициализировать вот так:
WaitHandle waitHandle = new AutoResetEvent(false);
... то в теле нашего метода DoTask можно будет (даже нужно!) оповестить о том, что метод завершил свою работу. Примерно вот так:


AutoResetEvent are = (AutoResetEvent)state;
are.Set();
Ну вообщем-то и все :) Пользуйтесь. Естественно, что от всех "прелестей" многопоточного приложения это вас не спасёт.

P.S.: пытался заставить мой переводчик переводить каждое предложение в отдельном потоке (точнее по два предложения за раз) - глухо. Где-то идут конфликты в обращениях к данным и в итоге код, который раньше в одном потоке работал без ошибок начинает падать. Причем очень странно падать - сообщения вида NullRefernceException при том, что там, куда указывает отладчик - null-значений вообще нет и взяться им неоткуда. Мистика :(

Никто не встречал программы, которая могла бы проанализировав код ткнуть пальцем и сказать, что вот тут и тут работать не будет в многопоточном приложении? Ибо перелопатить текущий код просто нереально - дешевле с нуля написать :(

четверг, 13 ноября 2008 г.

RTFStringBuilder

Вот здесь есть класс, основанный на StringBuilder и предназначеный для генерации RTF при вызове метода ToString(). Очень удобно тем, кого не устраивает генерация текстов в формате rtf с использованием RichTextBox (а это произойдет очень быстро - как только вы начнете активно использовать раскраску слов/букв разными цветами или разные шрифты).

Примеры использования:

RTFBuilderbase sb = new RTFBuilder();
sb.AppendLine("AppendLine Basic Text");

sb.Append("append text1").Append("append text2").Append("append text3").Append("append text4").AppendLine();

sb.FStyle(FontStyle.Bold).AppendLine("Bold");

sb.FStyle(FontStyle.Italic).AppendLine("Italic");

sb.FStyle(FontStyle.Strikeout).AppendLine("Strikeout");

sb.FStyle(FontStyle.Underline).AppendLine("Underline");

sb.FStyle(FontStyle.Bold | FontStyle.Italic | FontStyle.Strikeout | FontStyle.Underline).AppendLine("Underline/Bold/Italic/Underline");

sb.ForeColor(KnownColor.Red).AppendLine("ForeColor Red");

sb.BackColor(KnownColor.Yellow).AppendLine("BackColor Yellow");
string rtf = sb.ToString();
this.richTextBox1.Rtf = rtf.

// Merging an RTF Document is sublimely simple
sb.AppendRTFDocument(this.richTextBox4.Rtf);

//Inserting an Image - again very simple
sb.InsertImage(image);

среда, 12 ноября 2008 г.

Windows RSS Platform

Возможно кто-то еще не знает, но с выходом Internet Explorer 7 появилась т.н. Windows RSS Platform. Это набор API позволяющий получить доступ к тем rss-записям, что загрузил IE7. Подробно про API можно почитать здесь (на английском), а пока несколько примеров.

Объектная модель вот такая:



Получить полный список каналов можно вот так:
        public void FillTree()
        {
            IFeedFolder iff = ((IFeedFolder) fm.RootFolder);

            treeView1.BeginUpdate();
            AppendFeeds(iff, null);
            treeView1.EndUpdate();
        }

        void AppendFeeds(IFeedFolder folder, TreeNode parent)
        {
            TreeNode old_parent = parent;


            foreach (IFeedFolder subfolder in (IFeedsEnum)folder.Subfolders)
            {
                if (parent == null)
                    parent = treeView1.Nodes.Add(subfolder.Name);
                else
                    parent = parent.Nodes.Add(subfolder.Name);
                AppendFeeds(subfolder, parent);
            }

            parent = old_parent;

            foreach (IFeed feed in (IFeedsEnum)folder.Feeds)
            {
                if (parent == null)
                    treeView1.Nodes.Add(feed.Name);
                else
                    parent.Nodes.Add(feed.Name);
            }
        }

В данном случае я заполняю данными TreeView, поскольку в общем виде мы имеем древовидную структуру, если вспомнить про возможность распределять каналы по папкам и подпапкам. Соответственно, самый простой способ - рекурсивная функция.

Чтобы получить выбранный из списка канал, надо указать его полное имя, включающее все папки и подпапки. Примерно вот так:

IFeed feed = (IFeed)fm.GetFeed(e.Node.FullPath);

Ну а дальше ничего сложного :)

пятница, 7 ноября 2008 г.

Новая утилита для анализа кода - StyleCop

Вот тут рассказывают про новую утилиту от Microsoft для проверки кода - StyleCop. Интересно в ней то, что в отличие от теперь уже стандартного FxCop'а она проверяет C#-код, а не IL-код. Например, вот так:
Вообщем, всем смотреть и пробовать :)

четверг, 6 ноября 2008 г.

среда, 5 ноября 2008 г.

Способ обнаружения deadlock'ов

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

Полезная утилита

Оказывается в Vista встроили замечательную программу Robocopy. Ранее она была частью Windows Resourse Kit. Подробнее можно почитать здесь (на английском).

Основные возможности:

  • Автоматическое восстановление сетевого соединения при обрыве
  • Копирует атрибуты файлов, права доступа, файловые потоки и т.п.
  • Зеркалирование - т.е. автоматическое копирование/удаление папок/файлов так, чтобы конечная папка содержала те же файлы, что и исходная.
  • Индикатор прогресса :)

Вообщем, must use.

понедельник, 3 ноября 2008 г.

Про новую студию и С# 4.0...

Если кому интересно - вот тут есть немного скриншотов новой Visual Studio 2010, а также немного рассказывается про новое в C# 4.0.