Получил приглашение на Платформу 2010, которая пройдет 12-13 ноября. Постараюсь писать ежедневные отчеты в блог и изрядно снабжать их фотографиями)
пятница, 23 октября 2009 г.
суббота, 10 октября 2009 г.
Как написать программу для смартфона?
Для этого нам потребуется Visual Studio, Windows Mobile SDK и образы эмуляторов устройств (я использую Visual Studio 2008, Windows Mobile 5.0 SDK for Pocket PC и Localized Windows Mobile 5.0 Pocket PC Emulator Images). Писать мы будем приложение, обновляющее статус в Twitter с помощью Twitterizer.
Создаем новый проект для смарт-устройств:
В следующем окне выбираем «Приложение для устройства», задаем конечную платформу (у меня Windows Mobile 5.0 Pocket PC SDK) и версию .NET Compact Framework:
Переходим во вкладку «Form1.cs [Конструктор]» и перетаскиваем элементы управления, которые нам понадобятся:
- TextBox для ввода логина с именем login;
- TextBox для ввода пароля с именем password и свойством PasswordChar = “*”, чтобы пароль не был виден при вводе;
- TextBox для ввода текста сообщения с именем textField и свойствами Mutiline = “true”, maxLength = 140, так как дина твита не может превышать 140 символов;
- 3 элемента label для того, чтобы подписать что есть что;
- 2 кнопки меню для обновления статуса в Twitter и выхода из программы.
Также было бы неплохо знать сколько символов еще можно ввести до окончания лимита в 140 единиц. Для этого поместим на форму еще один элемент TextBox с именем characterNumber и значением 140 в свойстве текст.
Наш графический интерфейс готов. В итоге должно получиться что-то похожее на это:
Для того, чтобы использовать библиотеку Twitterizer нужно сделать следующие шаги:
Теперь перейдем в обработчик события menuItem1_Click (клик по кнопке Twit) и напишем вот такой код:
if ((login.Text == "") || (password.Text == "")) //проверка на заполнение полей
{
MessageBox.Show("Empty login or password", "Login/Password Entry Error");
}
else
{
if (textField.Text == "") //проверка на заполнение текста твита
{
MessageBox.Show("Empty Text field", "Empty Text field"); //обновляем статус
}
else
{
try
{
Twitter twit = new Twitter(login.Text, password.Text);
twit.Status.Update(textField.Text);
}
catch (TwitterizerException ex) //ловим исключения при обновлении статуса
{
string message = string.Format("Exception: {0}", ex.Message.ToString());
MessageBox.Show(message, "Exception");
}
}
}
* This source code was highlighted with Source Code Highlighter. В menuItem2_Click (клик по кнопке Exit):
private void menuItem2_Click(object sender, EventArgs e)
{
Close();
}
* This source code was highlighted with Source Code Highlighter. Для того, чтобы отслеживать количество оставшихся символов в «реальном времени», в событии KeyUp напишем следующее:
characterNumber.Text = (140 - textField.Text.Length).ToString();
* This source code was highlighted with Source Code Highlighter. Запустим наш проект с отладкой: пункт меню Отладка → Начать отладку. Если никаких ошибок мы не сделали, то получим предложение развернуть приложение:
Я использовал реальный коммуникатор на Windows Mobile 5.0 и он должен быть соединен с КПК через программу ActiveSync.
пятница, 2 октября 2009 г.
MSP Summit. First day.
Сегодня был первый день встречи студентов-партнеров Microsoft. Он проходил в недавно открывшемся Microsoft Technology Center. Говорят, мы были первыми, кто сидел за компьютерами в учебных классах. Нам показывали новые возможности .NET Framework 4.0 и Visual Studio 2010, учили создавать веб-слайсы, ускорители и свою сборку Internet Explorer и еще много чему. Вобщем было очень интересно. Получил огромное количество положительных эмоций, да и до сих пор пребываю в эйфорическом состоянии. Постараюсь через несколько дней написать что-то более осмысленное и подкрепить это неким количеством фотографий)))
пятница, 21 августа 2009 г.
Потоки в .Net. Часть 1.
Поток (thread) – это независимая последовательность инструкций в программе. Самый простой способ создания потоков – вызов делегата асинхронным образом.
static int TestThread(int data, int ms)
{
Console.WriteLine("TestThread started");
Thread.Sleep(ms);
Console.WriteLine("TestThread completed");
return ++data;
}
public delegate int TestThreadDelegate(int data, int ms);
Есть несколько способов узнать завершил ли делегат свою работу.Это можно сделать с помощью метода BeginInvoke(), в котором входные параметры можно передать вместе с типом делегата. Этот метод возвращает тип IAsyncResult, у которого есть свойство IsComleted. Вторым способом ожидания результата является использование дескриптора ожидания. Получить к нему доступ можно с помощью свойства AsyncWaitHanle. Третьим способом является использование обратного асинхронного вызова:
static void Main()
{
TestThreadDelegate d1 = TestThread;
d1.BeginInvoke(1, 3000, TestThreadCompleted, d1);
for (int i = 0; i < 100; i++)
{
Console.Write(".");
Thread.Sleep(50);
}
}
static void TestThreadCompleted(IAsyncResult ar)
{
if (ar == null) throw new ArgumentNullException("ar");
TestThreadDelegate d1 = ar.AsyncState as TestThreadDelegate;
Trace.Assert(d1 != null, "Invalid object type");
int result = d1.EndInvoke(ar);
Console.WriteLine("result: {0}", result);
}
Другим способом создания потоков является использование класса Thread. Он также позволяет управлять ими.
using System;
using System.Threading;
namespace Csharp.Threading.FirstThread
{
class Program
{
static void Main(string[] args)
{
Thread t1 = new Thread(ThreadMain);
t1.Start();
Console.WriteLine("This is the main thread.");
}
static void ThreadMain()
{
Console.WriteLine("In thread.");
}
}
}
Передавать данные потокам можно двумя способами: используя конструктор Thread с делегатом ParameterizedThreadStart, либо путем создания специального класса и определения метода потока, как метода экземпляра:
public class MyThread
{
private string data;
public MyThread(string data)
{
this.data = data;
}
public void ThreadMain()
{
Console.WriteLine("Running in a thread, data: {0}", data);
}
}
В Main:
MyThread obj = new myThread(“text”);
Thread tr = new Thread(obj.ThreadMain);
tr.Start();
Существует два типа потоков: приоритетный и фоновый. Процесс продолжает выполняться до тех пор, пока выполняется хотя бы один приоритетный поток. С помощью класса Thread по умолчанию создается именно он. Чтобы поток был фоновым нужно использовать свойство IsBackground.
Операционная система планирует порядок выполнения потоков. На этот процесс можно влиять путем назначения потоку соответствующего приоритета с помощью свойства Priority.
Иногда нужно заранее создать набор потоков, также увеличивать или уменьшать этот набор при возникновении необходимости. Для этого предусмотрен класс ThreadPool.
using System;
using System.Threading;
namespace Csharp.Threading.Pools
{
class Program
{
static void Main()
{
for (int i = 0; i < 5; i++)
{
ThreadPool.QueueUserWorkItem(JobForAThread);
}
Thread.Sleep(5000);
}
static void JobForAThread(object state)
{
for (int i = 0; i < 3; i++)
{
Console.WriteLine("loop {0}, running inside pooled thread {1}", i,
Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(10);
}
}
}
}
Но у пулов потоков есть некоторые ограничения: они являются фоновыми, также менять приоритет или имя потока в пуле нельзя.
Для начала это все. В следующий раз мы поговорим о взаимоблокировке и синхронизации потоков.
среда, 12 августа 2009 г.
Caffeine from Google
На днях Google предложил протестировать свой новый поиск под названием Caffeine. Я не преминул воспользоваться этой возможностью. И вот мои ощущения.
В целом стало лучше. По запросу “diman_dnk” количество элементов в выдаче увеличилось больше, чем в 4 раза, скорость выдачи (в расчете на один элемент), как и заявляли, возросла примерно в 2 раза. Релевантность стала напорядок лучше.
четверг, 6 августа 2009 г.
Windows 7 will be today!
Сегодня Windows 7 RTM должна появится в MSDN и MSDN AA. И что-то мне подсказывает, что Vista доживает свои последние дни на моем ноутбуке.
P.S. На прилавках магазинов Seven можно будет увидеть только 22 октября.
суббота, 27 июня 2009 г.
Windows Live Writer
Вот уже 4-ый пост пишу через этот клиент. Пока вселяет очень позитивные эмоции. Через web – интерфейс писать было не очень удобно и, случайно наткнувшись на Windows Live Writer, решил попробовать. Без проблем интегрировался с моим блогом. Вставка контента значительно удобнее, чем в web – интерфейсе. Вобщем нравится)